summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2004-03-23 15:34:26 +0000
committerburaq <buraq@epfl.ch>2004-03-23 15:34:26 +0000
commitd188fb525f72009251c2e98335d9d8eac0a7649c (patch)
tree91ca8d99180f7eb50ae1965c21a1480910ef40a8
parent4fdc1318ccdaa00ad2d677f91d93af479955ca2b (diff)
downloadscala-d188fb525f72009251c2e98335d9d8eac0a7649c.tar.gz
scala-d188fb525f72009251c2e98335d9d8eac0a7649c.tar.bz2
scala-d188fb525f72009251c2e98335d9d8eac0a7649c.zip
fixed handling of {
-rw-r--r--sources/scala/tools/scalac/ast/parser/MarkupParser.scala56
-rw-r--r--sources/scala/tools/scalac/ast/parser/Scanner.scala40
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.
*/