summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2004-06-03 20:05:08 +0000
committerburaq <buraq@epfl.ch>2004-06-03 20:05:08 +0000
commit1e59ef7fe08de15dd7a87d7b39f88d750c401c03 (patch)
treec398da5a87bf868e477fcc572a2ff10356538bb8 /sources
parent608e922cbc95a64229f7c237702378d484e5b9ac (diff)
downloadscala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.tar.gz
scala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.tar.bz2
scala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.zip
*** empty log message ***
Diffstat (limited to 'sources')
-rw-r--r--sources/scala/tools/dtd2scala/DeclToScala.scala23
-rw-r--r--sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml25
-rw-r--r--sources/scala/tools/scalac/ast/TreeList.scala14
-rw-r--r--sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala24
-rw-r--r--sources/scalac/transformer/matching/Autom2Scala.java6
-rw-r--r--sources/scalac/transformer/matching/BerrySethi.java28
-rw-r--r--sources/scalac/transformer/matching/BindingBerrySethi.java5
-rw-r--r--sources/scalac/transformer/matching/Label.java8
-rw-r--r--sources/scalac/transformer/matching/SequenceMatcher.java4
-rw-r--r--sources/scalac/transformer/matching/TestRegTraverser.java6
-rw-r--r--sources/scalac/transformer/matching/WordAutomInScala.java7
11 files changed, 104 insertions, 46 deletions
diff --git a/sources/scala/tools/dtd2scala/DeclToScala.scala b/sources/scala/tools/dtd2scala/DeclToScala.scala
index 39f3ccdc7f..2dfb924310 100644
--- a/sources/scala/tools/dtd2scala/DeclToScala.scala
+++ b/sources/scala/tools/dtd2scala/DeclToScala.scala
@@ -76,7 +76,7 @@ class DeclToScala(fOut:PrintWriter,
}
val sb = new StringBuffer();
for( val key <- curAttribs.keys ) {
- sb.append(" case Seq(");
+ sb.append(" case Seq((),");
curAttribs( key ) match {
case AttrDecl( key, tpe, df ) =>
appendKey( key, sb );
@@ -118,7 +118,7 @@ class DeclToScala(fOut:PrintWriter,
/*Console.println("sCM:"+ r.getClass() + " r:"+r );*/
r match {
case Eps => ""
- case RNode(name) => "$TagOf" + cookedCap( name );
+ case RNode(name) => refTag( name ).toString();
case Star(r) => "("+shallowContentModel( r ) +") *"
case Alt( rs @ _* ) => shallowContentModel1( rs, '|' )
case Sequ( rs @ _* ) => shallowContentModel1( rs, ',' )
@@ -136,28 +136,31 @@ class DeclToScala(fOut:PrintWriter,
case Star(Alt(PCDATA_, alts @ _*)) => {
val sb = new StringBuffer("tagIterator( ch ).forall( x:Int => x match {");
for( val alt <- alts.elements ) {
- sb.append(" case $TagOf");
- alt match { case RNode( name ) => sb.append( cookedCap( name ));}
+ sb.append(" case ");
+ alt match { case RNode( name ) => sb.append( refTag( name ).toString() )}
sb.append(" => true \n");
}
sb.append("case _ => false })");
sb.toString();
}
case _ => val sb = new StringBuffer("tagIterator( ch ).toList.match {");
- sb.append(" case Seq( ");
+ sb.append(" case Seq(");
sb.append( shallowContentModel( r ) );
sb.append( ") => true \n");
- sb.append( "case _ => false }\n");
+ sb.append( "case _ => Console.println( tagIterator( ch ).toList);false }\n");
sb.toString();
}
}
var tagCounter = 0;
- def newTag = {
+ val refTag = new HashMap[String,Int]();
+ def newTag(elemName:String) = {
val i = tagCounter;
tagCounter = tagCounter + 1;
+ refTag.update( elemName, i );
i
}
+
def write:Unit = {
def writeNode( x:Node ):Unit = {
//Console.println("visiting "+x);
@@ -177,8 +180,10 @@ class DeclToScala(fOut:PrintWriter,
fOut.print( validateAttributes( curAttribs ) );
case "shallowContentRegExp" =>
fOut.print( shallowValidate( curModel ) );
- case "elementTag" =>
- fOut.print( newTag.toString() );
+ case "makeTag" =>
+ fOut.print( newTag( lookup("elementName") ).toString() );
+ case "refTag" =>
+ fOut.print( refTag( lookup("elementName") ).toString() );
case "elementBinding" => {
for( val decl <- elemMap.values ) {
lookup += "elementName" -> decl.name;
diff --git a/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml b/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml
index dce193c3aa..63d1abf12f 100644
--- a/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml
+++ b/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml
@@ -42,6 +42,12 @@
+(map.keys.filter { x => map(x) == "&lt;R" })
.toList.mkString("",",",""));
+
+ def error_InvalidChildren( elName:String, ch:cT, cM:String ) =
+ error("trying to construct invalid "+elName+",\n children labels were: "
+ +ch.elements.map( x => x.label ).toList.mkString("",",","")
+ +"\n content model was "+cM);
+
abstract class <string ref="objectName"/>Node$ extends scala.xml.Node;
def tagIterator(ch:Seq[scala.xml.Node]):Iterator[Int] = new Iterator[Int] {
@@ -55,9 +61,10 @@
val n = it.next;
val i = n.typeTag$;
if( i > 0 ) i else $tagMap.get( n.label ) match {
- case Some( j ) => j
- case None => 0
- }
+ case Some( j ) => j
+ case _ => 0
+ }
+
} else {
error("internal error");
}
@@ -65,14 +72,16 @@
}
private val $tagMap = new mutable.HashMap[String,Int];
<elementBinding>
- val $TagOf&ccElementName;:int = <elementTag/>;
- $tagMap.update( &qElementName;, $TagOf&ccElementName; );
+ $tagMap.update( &qElementName;, <makeTag/> );
+ </elementBinding>
+ <elementBinding>
+
def constr_&ccElementName;( attrs:aT, ch:cT ) = &ccElementName;(attrs,ch:_*);
case class &ccElementName;( attrs:Map[String,String], ch:scala.xml.Node* ) extends <string ref="objectName"/>Node$ {
- final override def typeTag$ = $TagOf&ccElementName;;
+ final override def typeTag$ = <refTag/>;
final def shallowValidate&ccElementName;Children( ch:Seq[scala.xml.Node] ) =
<shallowContentRegExp/>;
@@ -94,7 +103,7 @@
}
if( !shallowValidate&ccElementName;Children( ch ) )
- error("trying to construct invalid &elementName;");
+ error_InvalidChildren( &qElementName;, ch, <qstring ref="elementContentModel"/> );
final def label = &qElementName;;
final def child = ch;
@@ -104,7 +113,7 @@
hmap = validateAttributes( attrs );
} catch {
case e:java.lang.Error =>
- error("trying to construct invalid &elementName;\n"+e.getMessage());
+ error("invalid attributes for &elementName;\n"+e.getMessage());
}
final def attribute:aT = hmap;
diff --git a/sources/scala/tools/scalac/ast/TreeList.scala b/sources/scala/tools/scalac/ast/TreeList.scala
index a51e532c4a..5dc3dda7a5 100644
--- a/sources/scala/tools/scalac/ast/TreeList.scala
+++ b/sources/scala/tools/scalac/ast/TreeList.scala
@@ -32,13 +32,13 @@ final class TreeList(ts: Array[Tree]) {
this
}
- def append(ts: Array[Tree]): unit = {
- for (val j <- Iterator.range(0, ts.length))
- append(ts(j));
+ def append(tts: Array[Tree]): unit = {
+ for (val j <- Iterator.range(0, tts.length))
+ append(tts(j));
}
def append(tl: TreeList): unit = {
- for (val j <- Iterator.range(0, tl.len)) // not ts.length !!
+ for (val j <- Iterator.range(0, tl.len))
append(tl.trees(j));
}
@@ -59,9 +59,9 @@ final class TreeList(ts: Array[Tree]) {
}
def toArray(): Array[Tree] = {
- val ts = new Array[Tree](len);
- System.arraycopy(trees, 0, ts, 0, len);
- ts
+ val tts = new Array[Tree](len);
+ System.arraycopy(trees, 0, tts, 0, len);
+ tts
}
def copyTo[t <: Tree](ts: Array[t]): Array[t] = copyTo(ts, 0);
diff --git a/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala b/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala
index ab068f8c35..f4dbf8de26 100644
--- a/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala
+++ b/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala
@@ -281,6 +281,7 @@ package scala.tools.scalac.ast.parser {
/** (2) nested `Sequence' nodes are flattened (( clique elimination ))
* nested empty subsequences get deleted
+ * for Apply nodes, sequence arguments are removed
*/
// apply `flattenSequence' to each tree in trees
@@ -295,6 +296,25 @@ package scala.tools.scalac.ast.parser {
// main algo for (2)
def flattenSequence( tree:Tree ):Tree = {
tree match {
+ case Tree$Apply( fn, trees:Array[Tree] ) =>
+ var li:List[Tree] = Nil;
+ var i = 0; while( i < trees.length ) {
+ trees(i) match {
+ case Tree$Sequence( trees2:Array[Tree] ) =>
+ Iterator.fromArray( flattenSequenceChildren( trees2 ).toArray() ).foreach {
+ x:Tree => li = x::li;
+ }
+ case z => li = z::li;
+ }
+ i = i + 1;
+ }
+ val newtrees:Array[Tree] = new Array[Tree]( li.length );
+ i = 0;
+ for( val nt <- li.reverse.elements ) {
+ newtrees( i ) = nt;
+ i = i + 1;
+ }
+ make.Apply( tree.pos, fn, newtrees )
/*
case Sequence( Tree[] trees ):
trees = flattenSequences( trees );
@@ -321,8 +341,8 @@ package scala.tools.scalac.ast.parser {
}
System.out.println();
*/
- val t = treeListToSequence( tree.pos, ts ) ;
- t
+ val t = treeListToSequence( tree.pos, ts ) ;
+ t
case Tree$Alternative( choices ) =>
make.Alternative( tree.pos, flattenSequences( choices ));
case Tree$Bind( vble, body ) =>
diff --git a/sources/scalac/transformer/matching/Autom2Scala.java b/sources/scalac/transformer/matching/Autom2Scala.java
index 22d20af9ee..a9c6af5cdb 100644
--- a/sources/scalac/transformer/matching/Autom2Scala.java
+++ b/sources/scalac/transformer/matching/Autom2Scala.java
@@ -142,13 +142,13 @@ public class Autom2Scala {
tags[ i ] = i;
bodies[ i ] = stateWrap( i );
}
- if( optimize )
+ //if( optimize )
return loadCurrentElem( gen.Switch( _state(),
tags,
bodies,
code_error(), // cannot happen
funRetType()));
-
+ /*
Tree res = code_error();
for( int i = dfa.nstates-2; i>= 0; i-- )
res = gen.If( cf.Equals( _state(), gen.mkIntLit( cf.pos, i )),
@@ -156,7 +156,7 @@ public class Autom2Scala {
res );
return loadCurrentElem( res );
-
+ */
}
AlgebraicMatcher am;
diff --git a/sources/scalac/transformer/matching/BerrySethi.java b/sources/scalac/transformer/matching/BerrySethi.java
index 1de1a0f192..a97552702a 100644
--- a/sources/scalac/transformer/matching/BerrySethi.java
+++ b/sources/scalac/transformer/matching/BerrySethi.java
@@ -1,5 +1,6 @@
package scalac.transformer.matching ;
+import scalac.Unit ;
import scalac.ApplicationError ;
import scalac.ast.Tree ;
import scalac.ast.TreeInfo ;
@@ -17,9 +18,17 @@ import java.util.* ;
class BerrySethi {
- boolean isStar( Name n ) {
- return TreeInfo.isNameOfStarPattern( n );
- }
+ Unit unit;
+
+ public BerrySethi(Unit unit) {
+ this.unit = unit;
+ }
+
+ boolean isStar( Name n ) {
+ boolean res = TreeInfo.isNameOfStarPattern( n );
+ //System.out.println("berry-sethi isStar?"+n.toString()+res);
+ return res;
+ }
/*
String s = n.toString();
@@ -355,8 +364,17 @@ class BerrySethi {
void seenLabel( Tree pat, Integer i, Label label ) {
this.posMap.put( pat, i );
this.labelAt.put( i, label );
- if( label != Label.DefaultLabel )
- this.labels.add( label );
+ if( label != Label.DefaultLabel ) {
+ if( this.labels.contains( label ) ) {
+ switch(label) {
+ case TreeLabel(Apply(_, Tree[] args)):
+ if( args.length > 0 ) {
+ unit.error(pat.pos, "sorry, this version of scalac cannot handle this pattern correctly");
+ }
+ }
+ }
+ this.labels.add( label );
+ }
}
/** overriden in BindingBerrySethi
diff --git a/sources/scalac/transformer/matching/BindingBerrySethi.java b/sources/scalac/transformer/matching/BindingBerrySethi.java
index b2a8301516..e68bef1eaf 100644
--- a/sources/scalac/transformer/matching/BindingBerrySethi.java
+++ b/sources/scalac/transformer/matching/BindingBerrySethi.java
@@ -1,5 +1,6 @@
package scalac.transformer.matching ;
+import scalac.Unit;
import scalac.Global ;
import scalac.ApplicationError ;
import scalac.ast.Tree ;
@@ -19,6 +20,10 @@ import java.util.* ;
public class BindingBerrySethi extends BerrySethi {
+ public BindingBerrySethi(Unit unit) {
+ super(unit);
+ }
+
HashMap deltaqRev[]; // delta of Rev
Vector defaultqRev[]; // default transitions of Rev
Vector qbinders[]; // transitions <-> variables
diff --git a/sources/scalac/transformer/matching/Label.java b/sources/scalac/transformer/matching/Label.java
index d04991c5d3..f03321cb22 100644
--- a/sources/scalac/transformer/matching/Label.java
+++ b/sources/scalac/transformer/matching/Label.java
@@ -30,11 +30,9 @@ public class Label {
case SimpleLabel( Literal lit ):
return lit.value.hashCode();
case TreeLabel( Tree pat ):
- switch( pat ) {
- case Apply( Tree fun, Tree[] args ):
- return pat.getType().hashCode() + args.hashCode();
- }
- return pat.hashCode();
+ // if pat is an Apply, than this case can only be correctly
+ // handled if it has no arguments...or there are no collisions
+ return pat.type().hashCode();
case TypeLabel( Type type ):
return type.hashCode();
default:
diff --git a/sources/scalac/transformer/matching/SequenceMatcher.java b/sources/scalac/transformer/matching/SequenceMatcher.java
index 5b0ff01ef4..fb8dfd8027 100644
--- a/sources/scalac/transformer/matching/SequenceMatcher.java
+++ b/sources/scalac/transformer/matching/SequenceMatcher.java
@@ -37,7 +37,7 @@ public class SequenceMatcher extends PatternTool {
*/
Tree addBinderToBody( Tree pat, Tree body ) {
if( bbuild == null )
- bbuild = new BindingBerrySethi();
+ bbuild = new BindingBerrySethi(unit);
Type elementType = cf.getElemType_Sequence( pat.getType() );
@@ -71,7 +71,7 @@ public class SequenceMatcher extends PatternTool {
}
private NondetWordAutom[] buildNfas( Tree[] pat ) {
- BerrySethi build = new BerrySethi();
+ BerrySethi build = new BerrySethi(unit);
NondetWordAutom manyNfa[] = new NondetWordAutom[ pat.length ];
for( int i = 0; i < pat.length; i++ ) {
diff --git a/sources/scalac/transformer/matching/TestRegTraverser.java b/sources/scalac/transformer/matching/TestRegTraverser.java
index bd01786734..fec6b3c0b4 100644
--- a/sources/scalac/transformer/matching/TestRegTraverser.java
+++ b/sources/scalac/transformer/matching/TestRegTraverser.java
@@ -48,8 +48,10 @@ public class TestRegTraverser extends Traverser {
break;
case Sequence( Tree[] trees):
- //result = true;
- traverse( trees );
+ if( trees.length == 0 ) {
+ result = true;
+ break;
+ } else traverse( trees );
//result = true;
break;
diff --git a/sources/scalac/transformer/matching/WordAutomInScala.java b/sources/scalac/transformer/matching/WordAutomInScala.java
index 51a3e85c3a..a8b2413c9c 100644
--- a/sources/scalac/transformer/matching/WordAutomInScala.java
+++ b/sources/scalac/transformer/matching/WordAutomInScala.java
@@ -35,8 +35,9 @@ public class WordAutomInScala extends Autom2Scala {
Tree result;
+ /*
boolean insane = true; // if you set this to false, you get some VerifyErrors
-
+ // seems fixed
if( insane ) { // cascading ifs
Tree cond[] = new Tree[body.length];
@@ -46,14 +47,14 @@ public class WordAutomInScala extends Autom2Scala {
result = cf.Switch( cond, body, failTree );
} else { // real switch
-
+ */
int tags[] = new int[body.length];
for( int i = body.length - 1; i >= 0; i-- ) {
tags[i] = i;
}
result = gen.Switch( _swres(), tags, body, failTree );
- }
+ //}
result = cf.gen.mkBlock( cf.pos, new Tree[] {
gen.ValDef( iterSym, cf.newIterator( selector )),