summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2004-05-04 16:17:54 +0000
committerburaq <buraq@epfl.ch>2004-05-04 16:17:54 +0000
commit61bfff74537a7926d19420ceeaf56831ffcc8f4f (patch)
tree2b999318eb2ba3767bd280b907246d5e75a22549
parent9d24efb389c5b0c5107faf7f3255ee5ccd4515cf (diff)
downloadscala-61bfff74537a7926d19420ceeaf56831ffcc8f4f.tar.gz
scala-61bfff74537a7926d19420ceeaf56831ffcc8f4f.tar.bz2
scala-61bfff74537a7926d19420ceeaf56831ffcc8f4f.zip
fixed pattern syntax to include XML sequence pa...
fixed pattern syntax to include XML sequence patterns
-rw-r--r--sources/scala/tools/scalac/ast/parser/MarkupParser.scala35
-rw-r--r--sources/scala/tools/scalac/ast/parser/Scanner.scala32
2 files changed, 59 insertions, 8 deletions
diff --git a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
index 6666c6a224..11cea98176 100644
--- a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
+++ b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
@@ -27,6 +27,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser ) {
val _AppendBuffer = Name.fromString("AppendBuffer");
val _collection = Name.fromString("collection");
val _Elem = Name.fromString("Elem");
+ val _Seq = Name.fromString("Seq");
val _mutable = Name.fromString("mutable");
val _append = Name.fromString("append");
val _xml = Name.fromString("xml");
@@ -46,6 +47,16 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser ) {
private def _scala( pos: int, name: Name ) =
make.Select( pos, make.Ident( pos, Names.scala ), name );
+ private def _scala_Seq( pos: int ) =
+ /*make.Apply( pos,
+ make.AppliedType(pos,*/
+ p.convertToTypeId( _scala( pos, _Seq ))/*,
+ (Predef.Array[Tree](
+ convertToTypeId(
+ _scala_xml_Node( pos ) ))
+ ),
+ Tree.EMPTY_ARRAY)*/;
+
private def _scala_xml( pos: int, name: Name ) =
make.Select( pos, _scala( pos, _xml ), name );
@@ -177,6 +188,10 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser ) {
make.Block( pos, blocArr, nIdent );
}
+ def makeXMLseqPat( pos:int, args:Array[Tree] ) = {
+ make.Apply( pos, _scala_Seq( pos ), args );
+ }
+
def makeXML(pos:int,n:Name,args:Array[Tree],attrMap:ListMap[Name,Tree]):Tree = {
var t = makeXML( pos, n, args );
if( attrMap.isEmpty ) {
@@ -349,10 +364,28 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser ) {
}
}
- /** @see xmlPattern. resynchronizes after succesful parse */
+ /** @see xmlPattern. resynchronizes after succesful parse
def xLiteralPattern = {
val t = xPattern; s.nextToken(); t
}
+ */
+
+ /** @see xmlPattern. resynchronizes after succesful parse
+ * @return this xml pattern
+ * precondition: s.xStartsXML == true
+ */
+ def xLiteralPattern:Tree = {
+ val pos = s.pos;
+ var tree = xPattern; s.token = EMPTY; s.nextToken();
+ if( s.xStartsXML ) {
+ val ts = new myTreeList(); ts.append( tree );
+ while( s.xStartsXML ) { ts.append( xPattern ); s.nextToken(); }
+ tree = makeXMLseqPat( pos, ts.toArray() );
+ }
+ tree
+ }
+
+
/** '<' xPattern ::= Name [S] { xmlPattern | '{' pattern3 '}' } ETag
* | Name [S] '/' '>'
diff --git a/sources/scala/tools/scalac/ast/parser/Scanner.scala b/sources/scala/tools/scalac/ast/parser/Scanner.scala
index ffb5c34f17..8b3f320209 100644
--- a/sources/scala/tools/scalac/ast/parser/Scanner.scala
+++ b/sources/scala/tools/scalac/ast/parser/Scanner.scala
@@ -428,8 +428,7 @@ class Scanner(_unit: Unit) extends TokenData {
case java.lang.Character.OTHER_SYMBOL => true;
case _ => false;}) {
putChar( ch );
- treatIdent;
- nextch();
+ getOperatorRest;
} else {
nextch();
syntaxError("illegal character");
@@ -574,9 +573,19 @@ class Scanner(_unit: Unit) extends TokenData {
} else {
putChar( '/' );
}
+
case _ =>
- treatIdent;
- return;
+ if( java.lang.Character.getType( ch ).asInstanceOf[byte] match {
+ case java.lang.Character.MATH_SYMBOL => true;
+ case java.lang.Character.OTHER_SYMBOL => true;
+ case _ => false;
+ }) {
+ putChar( ch );
+ nextch();
+ } else {
+ treatIdent;
+ return;
+ }
}
}
}
@@ -591,7 +600,15 @@ class Scanner(_unit: Unit) extends TokenData {
'|' | '\\' | '/' =>
getOperatorRest;
case _ =>
- treatIdent;
+ if( java.lang.Character.getType( ch ).asInstanceOf[byte] match {
+ case java.lang.Character.MATH_SYMBOL => true;
+ case java.lang.Character.OTHER_SYMBOL => true;
+ case _ => false;
+ }) {
+ getOperatorRest;
+ } else {
+ treatIdent;
+ }
}
}
@@ -944,7 +961,7 @@ class Scanner(_unit: Unit) extends TokenData {
* see [4] and Appendix B of XML 1.0 specification
*/
def xIsNameChar = xIsNameStart || (ch match {
- case '.' | '-' => true;
+ case '.' | '-' | ':' => true;
case _ => java.lang.Character.getType( ch ).asInstanceOf[Byte] match {
case java.lang.Character.COMBINING_SPACING_MARK => true; // Mc
case java.lang.Character.ENCLOSING_MARK => true; // Me
@@ -957,6 +974,7 @@ class Scanner(_unit: Unit) extends TokenData {
/** NameStart == Unicode general category in { Ll, Lu, Lo, Lt, Nl }
*
+ * We do not allow a name to start with ':'.
* see [3] and Appendix B of XML 1.0 specification
*/
def xIsNameStart =
@@ -967,7 +985,7 @@ class Scanner(_unit: Unit) extends TokenData {
case java.lang.Character.TITLECASE_LETTER => true;
case java.lang.Character.LETTER_NUMBER => true;
case _ => ch match {
- case '_' | ':' => true
+ case '_' => true
case _ => false;
}
}