From d03b5fd70e6514cd87e15de1fb49b63967857a8d Mon Sep 17 00:00:00 2001 From: buraq Date: Fri, 11 Jun 2004 09:35:32 +0000 Subject: bugfix in XML literal parsing --- sources/scala/tools/scalac/ast/parser/MarkupParser.scala | 12 ++++++++---- sources/scala/tools/scalac/ast/parser/Scanner.scala | 13 ++++++++----- test/files/jvm/xmlLiterals.scala | 10 +++++----- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala index 6b0894abe4..a33e7fc810 100644 --- a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala +++ b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala @@ -378,6 +378,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) { s.xNext; gen.mkStringLit( pos, tmp ) case '{' => + s.xNext; xScalaExpr; case _ => s.xSyntaxError( "' or \" delimited attribute value or '{' scala-expr '}' expected" ); @@ -411,7 +412,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) { /* [42] '<' xmlEndTag ::= '<' '/' Name S? '>' */ def xEndTag( n:Name ) = { s.xToken('/'); - if( n != s.xName ) s.xSyntaxError( "expected closing tag of " + n ); + if(n != s.xName) s.xSyntaxError( "expected closing tag of " + n ); s.xSpaceOpt; s.xToken('>') } @@ -419,7 +420,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) { def xScalaExpr:Tree = { s.xSync; val b = p.expr(true,false); - if( s.token != RBRACE ) + if(s.token != RBRACE) s.xSyntaxError(" expected end of Scala block"); return b } @@ -430,8 +431,8 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) { */ def xExpr:Tree = { var pos = s.pos; - val Tuple2( elemName, attrMap ) = xTag; - if( s.ch == '/' ) { // empty element + val Tuple2(elemName, attrMap) = xTag; + if(s.ch == '/') { // empty element s.xToken('/'); s.xToken('>'); makeXML( pos, elemName, Tree.EMPTY_ARRAY, attrMap ); @@ -523,6 +524,8 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) { } + /** xScalaPatterns ::= patterns + */ def xScalaPatterns:Array[Tree] = { s.xSync; val b = p.patterns(); @@ -565,6 +568,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser, preserveWS:boolean ) { } case '{' => // embedded Scala patterns while( s.ch == '{' ) { + s.nextch(); ts.append( xScalaPatterns ); } // postcond: s.xScalaBlock = false; diff --git a/sources/scala/tools/scalac/ast/parser/Scanner.scala b/sources/scala/tools/scalac/ast/parser/Scanner.scala index 8acc2d78b2..bf5a7c6100 100644 --- a/sources/scala/tools/scalac/ast/parser/Scanner.scala +++ b/sources/scala/tools/scalac/ast/parser/Scanner.scala @@ -888,15 +888,18 @@ class Scanner(_unit: Unit) extends TokenData { } } - // start XML tokenizing. + // start XML tokenizing methods // prod. [i] refers to productions in http://www.w3.org/TR/REC-xml + /** calls nextToken, starting the scanning of Scala tokens, + * after XML tokens. + */ + def xSync = { - token = SEMI; // last token might have been RBRACE, avoid SEMI - pos = Position.encode( cline,ccol ); - nextch(); - nextToken(); + token = SEMI; // avoid getting SEMI from nextToken if last was RBRACE xScalaBlock = false; + //nextch(); + nextToken(); } def xSyntaxError(s:String) = { diff --git a/test/files/jvm/xmlLiterals.scala b/test/files/jvm/xmlLiterals.scala index 13b2591790..f3ee124d33 100644 --- a/test/files/jvm/xmlLiterals.scala +++ b/test/files/jvm/xmlLiterals.scala @@ -157,14 +157,14 @@ object Test03Servlet {

Welcome

- { headerMsg } + {headerMsg }

{ ns:_* }


- { footerMsg } + {footerMsg}

Bye!

@@ -178,11 +178,11 @@ object Test03Servlet { /** this is a recursive procedure that adds some attributes to the tree */ def beautify( n:Node ):Node = n match { - case { xs @ _* } => + case {xs @ _* } => { xs:_* } case { xs @ _* }
=> - { beautify( xs ):_* }
+ { beautify( xs ):_*}
case Elem( label, _, xs @ _* ) => new Elem( label, beautify( xs ):_*) @@ -241,7 +241,7 @@ object Test03Servlet { val tryBrace = Now escaped {{ braces } ; assertEquals( tryBrace, Elem("try",e,Text("Now escaped { braces }"))); - val tryBrace2 = cool ?; + val tryBrace2 = cool ?; assertEquals( tryBrace2.attribute("myAttrib"), "7" ); /* Scala comments are not allowed in XML literals. see neg(2) */ -- cgit v1.2.3