diff options
author | buraq <buraq@epfl.ch> | 2004-06-03 20:05:08 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2004-06-03 20:05:08 +0000 |
commit | 1e59ef7fe08de15dd7a87d7b39f88d750c401c03 (patch) | |
tree | c398da5a87bf868e477fcc572a2ff10356538bb8 /sources/scalac/transformer/matching | |
parent | 608e922cbc95a64229f7c237702378d484e5b9ac (diff) | |
download | scala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.tar.gz scala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.tar.bz2 scala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac/transformer/matching')
7 files changed, 44 insertions, 20 deletions
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 )), |