diff options
author | buraq <buraq@epfl.ch> | 2004-03-23 15:34:26 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2004-03-23 15:34:26 +0000 |
commit | d188fb525f72009251c2e98335d9d8eac0a7649c (patch) | |
tree | 91ca8d99180f7eb50ae1965c21a1480910ef40a8 | |
parent | 4fdc1318ccdaa00ad2d677f91d93af479955ca2b (diff) | |
download | scala-d188fb525f72009251c2e98335d9d8eac0a7649c.tar.gz scala-d188fb525f72009251c2e98335d9d8eac0a7649c.tar.bz2 scala-d188fb525f72009251c2e98335d9d8eac0a7649c.zip |
fixed handling of {
-rw-r--r-- | sources/scala/tools/scalac/ast/parser/MarkupParser.scala | 56 | ||||
-rw-r--r-- | sources/scala/tools/scalac/ast/parser/Scanner.scala | 40 |
2 files changed, 68 insertions, 28 deletions
diff --git a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala index f52f30092e..e6a5a83634 100644 --- a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala +++ b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala @@ -211,26 +211,24 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser ) { /** parse attribute and add it to listmap * [41] Attributes ::= { S Name Eq AttValue } - * AttValue ::= `'` { _ | `{` scalablock `}` } `'` - * ::= `"` { _ | `{` scalablock `}` } `"` + * AttValue ::= `'` { _ } `'` + * | `"` { _ } `"` + * | `{` scalablock `}` */ def xAttributes = { var aMap = ListMap.Empty[Name,Tree]; while( s.xIsNameStart ) { val key = s.xName; s.xEQ; - val endch = s.ch; - val value = endch match { + val delim = s.ch; + val value = delim match { case '"' | '\'' => val pos = s.pos; - s.xNext; val tmp = s.xAttributeValue( endch ); + s.xNext; val tmp = s.xAttributeValue( delim ); s.xNext; s.xSpaceOpt; gen.mkStringLit( pos, tmp ) case '{' => - Console.println("LBRACE, s.pos = " + s.pos); - s.nextToken(); // = LBRACE - Console.println("(2), s.pos = " + s.pos); + s.xNext; s.nextToken(); - Console.println("(3), is LBRACE ?"+s.token == LBRACE+" s.pos = " + s.pos); val tmp = p.expr(false,false); if( s.token != RBRACE ) { s.xSyntaxError("expected end of Scala block"); @@ -286,33 +284,41 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser ) { val ts = new myTreeList(); var exit = false; while( !exit ) { - /* Console.println("read '"+s.ch.asInstanceOf[char]+"'"); */ + //Console.println("in loop, ch='"+s.ch.asInstanceOf[char]+"'"); s.ch match { + case '<' => // another tag + //Console.println("case <"); + s.xNext; s.ch match { case '/' => exit = true; // end tag case '!' => s.xComment; case _ => ts.append( xExpr ); // parse child } - case '{' => // Scala block(s) - while( s.ch == '{' ) { - var lastbp = s.bp; - s.nextToken(); // = LBRACE - lastbp = s.bp - lastbp; + + case '{' => + //Console.print("case {"); + if( s.xCheckScalaBlock ) { + //Console.println(" isBlock"); s.nextToken(); - if(( s.token == LBRACE )&&( 1 == lastbp )) { // {{ => "{" - ts.append( makeText( s.pos, "{" )); - } else { - val bs = new myTreeList(); - val b = p.expr(true,false); //block( s.pos ); - if( s.token != RBRACE ) { - s.xSyntaxError(" expected end of Scala block"); - } - ts.append( b ); + s.xScalaBlock = false; + val b = p.expr(true,false); + if( s.token != RBRACE ) { + s.xSyntaxError(" expected end of Scala block"); } + ts.append( b ); + //Console.println(" RETURN isBlock, b = "+b); + } else { + //Console.println(" isText"); + + val str = new StringBuffer("{"); + str.append( s.xText ); + ts.append( makeText( s.pos, str.toString() )); } case _ => // text content - ts.append( makeText( s.pos, s.xText )); + //Console.println("case_"); + ts.append( makeText( s.pos, s.xText )); + //Console.println("parser Text, ts="+ts); } } xEndTag( elemName ); diff --git a/sources/scala/tools/scalac/ast/parser/Scanner.scala b/sources/scala/tools/scalac/ast/parser/Scanner.scala index d323f87f0c..b4ab70ddaa 100644 --- a/sources/scala/tools/scalac/ast/parser/Scanner.scala +++ b/sources/scala/tools/scalac/ast/parser/Scanner.scala @@ -680,9 +680,12 @@ class Scanner(_unit: Unit) extends TokenData { /* methods for XML tokenizing, see XML 1.0 rec http://www.w3.org/xml */ def xSyntaxError(s:String) = { + //throw new ApplicationError(); syntaxError("in XML literal: "+s); xNext; } + var xScalaBlock = false; + /** read the next character. do not skip whitespace. * treat CR LF as single LF. update ccol and cline * @@ -704,7 +707,7 @@ class Scanner(_unit: Unit) extends TokenData { } else { bp = bp - 1; ch = CR } - case _ => + case _ => //Console.print(ch.asInstanceOf[char]); } pos = Position.encode(cline, ccol); } @@ -811,9 +814,40 @@ class Scanner(_unit: Unit) extends TokenData { } } - /** character data. WRONG + /* move forward one char, return true if next character starts a scala block */ + def xxNext:boolean = { + xNext; + xCheckScalaBlock + } + /* return true if next character starts a scala block */ + def xCheckScalaBlock:boolean = { + if( ch == '{' ) { + xNext; + xScalaBlock = ( ch != '{' ); + //xSyntaxError("block detected, xScalaBlock = "+xScalaBlock); + } + return xScalaBlock; + } + + /** character data. */ - def xText:String = xSkipToNext( '<' ); + def xText:String = { + + //Console.println( "xScalaBlock="+xScalaBlock+" bp="+bp+" + ch="+ch); + if( xCheckScalaBlock ) + return "" + else { + val sb = new StringBuffer(); + lastpos = pos; + val index = bp; + var exit = false; + while( !exit ) { + sb.append( ch ); + exit = xxNext || ( ch == '<' ); + } + sb.toString(); + } + } /** scan XML comment. */ |