summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/matching
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/scalac/transformer/matching
parent608e922cbc95a64229f7c237702378d484e5b9ac (diff)
downloadscala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.tar.gz
scala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.tar.bz2
scala-1e59ef7fe08de15dd7a87d7b39f88d750c401c03.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/transformer/matching')
-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
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 )),