summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/transformer/matching/CodeFactory.java2
-rw-r--r--sources/scalac/transformer/matching/CollectVariableTraverser.java20
-rw-r--r--sources/scalac/transformer/matching/LeftTracerInScala.java21
-rw-r--r--sources/scalac/transformer/matching/NoSeqVariableTraverser.java6
-rw-r--r--sources/scalac/transformer/matching/NondetWordAutom.java13
-rw-r--r--sources/scalac/transformer/matching/RightTracerInScala.java134
-rw-r--r--sources/scalac/transformer/matching/SequenceMatcher.java291
-rw-r--r--sources/scalac/transformer/matching/WordAutomInScala.java18
8 files changed, 233 insertions, 272 deletions
diff --git a/sources/scalac/transformer/matching/CodeFactory.java b/sources/scalac/transformer/matching/CodeFactory.java
index ff874aec5c..f8a58f1bf7 100644
--- a/sources/scalac/transformer/matching/CodeFactory.java
+++ b/sources/scalac/transformer/matching/CodeFactory.java
@@ -83,7 +83,7 @@ class CodeFactory extends PatternTool {
Type tpe1 = tpe.widen().baseType( defs.SEQ_CLASS );
if( tpe1 == Type.NoType )
- throw new ApplicationError("arg "+tpe+" not subtype of Sequence[ A ]");
+ throw new ApplicationError("arg "+tpe+" not subtype of Seq[ A ]");
return tpe1.typeArgs()[ 0 ];
}
diff --git a/sources/scalac/transformer/matching/CollectVariableTraverser.java b/sources/scalac/transformer/matching/CollectVariableTraverser.java
index 73c81a9207..207eeea419 100644
--- a/sources/scalac/transformer/matching/CollectVariableTraverser.java
+++ b/sources/scalac/transformer/matching/CollectVariableTraverser.java
@@ -4,34 +4,40 @@ import scalac.util.Name ;
import scalac.ast.Tree ;
import scalac.symtab.Symbol ;
-import java.util.Vector;
-class CollectVariableTraverser extends VariableTraverser {
+import java.util.HashSet;
- protected Vector vars;
+class CollectVariableTraverser extends VariableTraverser {
+ protected HashSet nogeneratedVars;
+ protected HashSet vars;
+ /*
boolean isVariableName( Name name ) {
return ( name.toString().indexOf("$") == -1 )
&& super.isVariableName( name );
}
-
+ */
void handleVariableSymbol( Symbol sym ) {
vars.add( sym );
+ if( sym.name.toString().indexOf("$") == -1 ) {
+ nogeneratedVars.add( sym );
+ }
}
public CollectVariableTraverser() {
- this.vars = new Vector();
+ this.vars = new HashSet();
+ this.nogeneratedVars = new HashSet();
}
static boolean containsBinding( Tree pat ) {
CollectVariableTraverser cvt = new CollectVariableTraverser();
cvt.traverse( pat );
- return !cvt.vars.isEmpty();
+ return !cvt.nogeneratedVars.isEmpty();
}
- static Vector collectVars( Tree pat ) {
+ static HashSet collectVars( Tree pat ) {
CollectVariableTraverser cvt = new CollectVariableTraverser();
cvt.traverse( pat );
return cvt.vars;
diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java
index 970380a506..576d3129c7 100644
--- a/sources/scalac/transformer/matching/LeftTracerInScala.java
+++ b/sources/scalac/transformer/matching/LeftTracerInScala.java
@@ -15,6 +15,7 @@ import ch.epfl.lamp.util.Position;
public class LeftTracerInScala extends TracerInScala {
+ HashMap export_nestedMap;
Tree selector;
/** symbol of the accumulator ( scala.SequenceList )
@@ -27,16 +28,14 @@ public class LeftTracerInScala extends TracerInScala {
return cf.SeqTraceType( elemType );
}
-
- Matcher _m ;
public LeftTracerInScala( DetWordAutom dfa,
Type elementType,
- Matcher m,
+ Symbol owner,
+ Tree selector,
CodeFactory cf ) {
- super( dfa, elementType, m.owner, cf );
- this._m = m;
- this.selector = m.selector;
+ super( dfa, elementType, owner, cf );
+ this.selector = selector;
helpVarDefs = new Vector();
}
@@ -79,7 +78,7 @@ public class LeftTracerInScala extends TracerInScala {
protected void initializeSyms() {
funSymName = "leftTracer";
- nestedMap = new HashMap();
+ export_nestedMap = new HashMap();
super.initializeSyms();
this.accumType = _accumType( elementType );
@@ -251,14 +250,12 @@ public class LeftTracerInScala extends TracerInScala {
for( Iterator it = v.iterator(); it.hasNext(); )
res[ j++ ] = (Tree) it.next();
- _m.varMap = nestedMap;
+ //_m.varMap = export_nestedMap;
return res;
}
- public HashMap nestedMap;
-
// calling the AlgebraicMatcher here
Tree _cur_match( Tree pat ) {
//System.out.println("calling algebraic matcher on type:"+pat.type);
@@ -272,7 +269,7 @@ public class LeftTracerInScala extends TracerInScala {
case Sequence(Tree[] pats):
//System.out.println("ouch! v Left");
Symbol hv = makeHelpVarSEQ( pat );
- nestedMap.put( pat, hv );
+ export_nestedMap.put( pat, hv );
Tree stm = gen.Assign( gen.Ident(Position.FIRSTPOS, hv), currentElem() );
m.stms = new Tree[2];
m.stms[0] = stm;
@@ -284,7 +281,7 @@ public class LeftTracerInScala extends TracerInScala {
HashMap helpMap = FreshVariableTraverser.getVars( pat, owner, cf.fresh );
//System.out.println("varMap: "+helpMap );
- m.varMap = helpMap;
+ //m.varMap = helpMap;
//replaceVars( pat );
diff --git a/sources/scalac/transformer/matching/NoSeqVariableTraverser.java b/sources/scalac/transformer/matching/NoSeqVariableTraverser.java
index f557155316..9dc226ab2f 100644
--- a/sources/scalac/transformer/matching/NoSeqVariableTraverser.java
+++ b/sources/scalac/transformer/matching/NoSeqVariableTraverser.java
@@ -5,7 +5,7 @@ import scalac.ast.Tree ;
import scalac.ast.Traverser ;
import scalac.symtab.Symbol ;
-import java.util.Vector;
+import java.util.HashSet;
class NoSeqVariableTraverser extends CollectVariableTraverser {
@@ -22,7 +22,7 @@ class NoSeqVariableTraverser extends CollectVariableTraverser {
super();
}
- static Vector varsNoSeq( Tree pat ) {
+ static HashSet varsNoSeq( Tree pat ) {
NoSeqVariableTraverser nvt = new NoSeqVariableTraverser();
nvt.traverse( pat );
@@ -30,7 +30,7 @@ class NoSeqVariableTraverser extends CollectVariableTraverser {
}
- static Vector varsNoSeq( Tree[] pats ) {
+ static HashSet varsNoSeq( Tree[] pats ) {
NoSeqVariableTraverser nvt = new NoSeqVariableTraverser();
for(int i = 0; i < pats.length; i++)
diff --git a/sources/scalac/transformer/matching/NondetWordAutom.java b/sources/scalac/transformer/matching/NondetWordAutom.java
index 513a49b115..143baf22a8 100644
--- a/sources/scalac/transformer/matching/NondetWordAutom.java
+++ b/sources/scalac/transformer/matching/NondetWordAutom.java
@@ -412,6 +412,18 @@ public class NondetWordAutom {
}
+ /** collects variables
+ * @return all variables bound by this binding nfa
+ */
+ static Set collectVariables( NondetWordAutom nfa ) {
+ HashSet seqVars = new HashSet();
+ for( int j = 0; j < nfa.nstates; j++ ) {
+ if( nfa.qbinders[ j ] != null )
+ seqVars.addAll( nfa.qbinders[ j ] );
+ }
+ return seqVars;
+ }
+
/** collapses several normalized NondetWordAutom objects into one.
*/
@@ -516,4 +528,5 @@ public class NondetWordAutom {
}
+
}
diff --git a/sources/scalac/transformer/matching/RightTracerInScala.java b/sources/scalac/transformer/matching/RightTracerInScala.java
index 2e25965e55..1b130b4be9 100644
--- a/sources/scalac/transformer/matching/RightTracerInScala.java
+++ b/sources/scalac/transformer/matching/RightTracerInScala.java
@@ -23,10 +23,10 @@ import ch.epfl.lamp.util.Position;
public class RightTracerInScala extends TracerInScala {
- Vector seqVars;
- Vector allVars;
+ Set seqVars;
+ Set allVars;
- Matcher _m;
+ Set varsToExport ;
Symbol targetSym;
@@ -36,36 +36,25 @@ public class RightTracerInScala extends TracerInScala {
/** translate right tracer to code
* @param dfa determinized left tracer
- * @param left nondeterm. left tracer
+ * @param left nondeterm. left tracer (only needed for variables!)
* @param cf ...
* @param pat ?
* @param elementType ...
*/
public RightTracerInScala( DetWordAutom dfa,
- NondetWordAutom left,
- Matcher m,
+ Set seqVars,
+ Symbol owner,
CodeFactory cf,
Tree pat,
Type elementType ) {
- super( dfa, elementType, m.owner, cf );
- this._m = m;
-
- Vector seqVars = new Vector();
-
- for( int j = 0; j < left.nstates; j++ ) {
- if( left.qbinders[ j ] != null )
- for( Iterator it = left.qbinders[ j ].iterator();
- it.hasNext() ; ) {
- Symbol varSym = (Symbol) it.next();
-
- if( !seqVars.contains( varSym ) )
- seqVars.add( varSym );
- }
- }
-
+ super( dfa, elementType, owner, cf );
this.seqVars = seqVars;
this.allVars = CollectVariableTraverser.collectVars( pat );
+ this.varsToExport = new HashSet();
+ varsToExport.addAll( allVars );
+ varsToExport.removeAll( seqVars );
+
helpMap2 = new HashMap();
helpVarDefs = new Vector();
@@ -75,7 +64,8 @@ public class RightTracerInScala extends TracerInScala {
for( Iterator it = allVars.iterator(); it.hasNext(); ) {
Symbol varSym = (Symbol) it.next();
- if( !seqVars.contains( varSym )) {
+ if(( varSym.name.toString().indexOf("$") == -1 )
+ && ( !seqVars.contains( varSym ))) {
makeHelpVar( varSym, true );
}
}
@@ -91,7 +81,7 @@ public class RightTracerInScala extends TracerInScala {
*/
void makeHelpVar( Symbol realVar, boolean keepType ) {
- Symbol helpVar = new TermSymbol( pos,
+ Symbol helpVar = new TermSymbol( cf.pos,
cf.fresh.newName( realVar.name
.toString() ),
owner,
@@ -104,7 +94,6 @@ public class RightTracerInScala extends TracerInScala {
else
helpVar.setType( defs.LIST_TYPE(elementType) );
-
helpMap.put( realVar, helpVar );
Tree rhs;
@@ -148,13 +137,13 @@ public class RightTracerInScala extends TracerInScala {
.setType( defs.INT_TYPE() ) ;
this.curSym = new TermSymbol( pos,
- cf.fresh.newName("elem"),
+ cf.fresh.newName("currentElement"),
funSym,
0)
.setType( elementType ) ;
this.targetSym = new TermSymbol( pos,
- cf.fresh.newName("trgt"),
+ cf.fresh.newName("targetState"),
funSym,
0)
.setType( defs.INT_TYPE() ) ;
@@ -168,7 +157,7 @@ public class RightTracerInScala extends TracerInScala {
Tree loadCurrentElem( Tree body ) {
return gen.mkBlock( new Tree[] {
gen.If( cf.isEmpty( _iter() ),
- run_finished( 0 ),
+ run_finished( 0 ), // we are done
gen.mkBlock( new Tree[] {
gen.ValDef( this.targetSym,
cf.SeqTrace_headState( gen.Ident( pos, iterSym))),
@@ -178,43 +167,6 @@ public class RightTracerInScala extends TracerInScala {
)});
}
- /*
- public Tree code_body() {
-
- Tree body = code_error(); // never reached at runtime.
-
- // state [ nstates-1 ] is the dead state, so we skip it
-
- //`if( state == q ) <code_state> else {...}'
- for( int i = dfa.nstates-1; i >= 0; i-- ) {
- body = code_state( i, body );
- }
-
- Tree t3 = gen.If( cf.isEmpty( _iter() ),
- run_finished( 0 ),
- gen.mkBlock( new Tree[] {
- gen.ValDef( targetSym,
- cf.SeqTrace_headState( gen.Ident( pos, iterSym))),
- gen.ValDef( curSym,
- cf.SeqTrace_headElem( gen.Ident( pos, iterSym))),
-
- body }));
-
- t3 = gen.mkBlock( new Tree[] {
- cf.debugPrintRuntime("enter binderFun"),
- cf.debugPrintRuntime(" state:"),
- cf.debugPrintRuntime( gen.Ident( pos, stateSym )),
- cf.debugPrintRuntime(" iter:"),
- cf.debugPrintRuntime(_iter()),
- cf.debugPrintNewlineRuntime(""),
- t3 });
-
-
- //System.out.println("enter RightTracerInScala:code_body()");// DEBUG
- //System.out.println("dfa.nstates"+dfa.nstates);// DEBUG
- return t3;
- }
- */
/** see code_state0_NEW
*/
Tree code_state0( Tree elseBody ) { // careful, map Int to Int
@@ -258,7 +210,10 @@ public class RightTracerInScala extends TracerInScala {
Integer I = (Integer) tmapTag.get( tagI );
targets[ i ] = (Tree) tmapBody.get( I );
}
- return gen.Switch( gen.Ident( pos, targetSym ), tags, targets, code_error()/*cannot happen*/ );
+ return gen.Switch( gen.Ident( pos, targetSym ),
+ tags,
+ targets,
+ code_error()/*cannot happen*/ );
}
@@ -347,11 +302,7 @@ public class RightTracerInScala extends TracerInScala {
currentElem(),
defs.BOOLEAN_TYPE() );
- // there could be variables in regular expressions under Sequence
- // node, export those later (?!WHY?!)
-
- Vector varsToExport = NoSeqVariableTraverser.varsNoSeq( pat );
- HashMap freshenMap = new HashMap();
+ final HashMap freshenMap = new HashMap();
HashMap helpMap3 = new HashMap();
// "freshening": never use the same symbol more than once
@@ -359,25 +310,48 @@ public class RightTracerInScala extends TracerInScala {
for( Iterator it = varsToExport.iterator(); it.hasNext(); ) {
Symbol key = (Symbol) it.next();
- this.helpMap2.put( key, helpMap.get( key ));
- // "freshening"
- Symbol newSym = key.cloneSymbol();
- newSym.name = key.name.append( Name.fromString("gu234") ); // is fresh now :-)
- freshenMap.put( key, newSym );
- helpMap3.put( newSym, helpMap.get( key ));
+ if( key.name.toString().indexOf("$") == -1 ) {
+ this.helpMap2.put( key, helpMap.get( key ));
+ // "freshening" by appending string ( a bit dangerous )
+ Symbol newSym = key.cloneSymbol().setOwner( funSym );
+ newSym.name = key.name.append( Name.fromString("%") );
+ freshenMap.put( key, newSym );
+ helpMap3.put( newSym, helpMap.get( key ));
+ //System.out.println( "key: "+ key + " key.owner:"+key.owner());
+ //System.out.println( "newsym owner:"+newSym.owner());
+ } else {
+ freshenMap.put( key, key );
+ }
}
- //System.out.println("RightTracerInScala::freshenMap :"+freshenMap);
//System.out.println("RightTracerInScala:: -pat :"+pat.toString());
- //System.out.println("RightTracerInScala::varsToExport :"+varsToExport);
+ /*
+System.out.println("RightTracerInScala - the seqVars"+seqVars);
+ System.out.println("RightTracerInScala - the varsToExport"+varsToExport);
+ */
+ //System.out.println("RightTracerInScala::freshenMap :"+freshenMap);
// "freshening"
/* TEST
*/
TreeCloner tc = new TreeCloner( cf.unit.global, freshenMap, Type.IdMap );
+
+ /*
+ Transformer tc = new Transformer(cf.unit.global) {
+ public Tree transform(Tree tree) {
+ tree = super.transform(tree);
+ if (tree.hasSymbol()) {
+ Object symbol = freshenMap.get(tree.symbol());
+ if (symbol != null) tree.setSymbol((Symbol)symbol);
+ }
+ return tree;
+ }
+ };
+ */
pat = tc.transform( pat );
+
//System.out.println("RightTracerInScala:: -pat( after subst ) :"+pat);
// val match { case <pat> => { <do binding>; true }
@@ -493,8 +467,6 @@ public class RightTracerInScala extends TracerInScala {
result[ j++ ] = (Tree) it.next();
}
- // helpvarSEQ via _m.varMap
-
return result;
}
diff --git a/sources/scalac/transformer/matching/SequenceMatcher.java b/sources/scalac/transformer/matching/SequenceMatcher.java
index e2e289c9f8..0fae04cf51 100644
--- a/sources/scalac/transformer/matching/SequenceMatcher.java
+++ b/sources/scalac/transformer/matching/SequenceMatcher.java
@@ -7,7 +7,7 @@ import Tree.*;
//import scala.compiler.printer.TextTreePrinter ; // DEBUGGING\
//import scala.compiler.printer.XMLAutomPrinter ; // DEBUGGING\
-import scalac.transformer.TransMatch.Matcher ;
+ import scalac.transformer.TransMatch.Matcher ;
import scalac.ast.* ;
import scalac.symtab.* ;
@@ -23,187 +23,162 @@ import ch.epfl.lamp.util.Position;
public class SequenceMatcher extends PatternTool {
- CodeFactory cf;
+ final static Integer IGNORED = new Integer(42);
+ CodeFactory cf;
- Matcher _m;
+ Matcher _m;
- Tree pat[];
- Tree body[];
+ //Tree pat[];
+ //Tree body[];
+
+ BindingBerrySethi bbuild = null;
/** translates the det/switching automaton to scala code
* precondition: pat.type() corresponds to element type
*/
- Tree addBinderToBody( Tree pat, Tree body ) {
-
- Type elementType = cf.getElemType_Sequence( pat.getType() );
-
- BindingBerrySethi build = new BindingBerrySethi();
- NondetWordAutom left = build.automatonFrom( pat, new Integer(0) );
- NondetWordAutom right = build.revnfa;
+ Tree addBinderToBody( Tree pat, Tree body ) {
+ if( bbuild == null )
+ bbuild = new BindingBerrySethi();
- // - - -> left
+ Type elementType = cf.getElemType_Sequence( pat.getType() );
- DetWordAutom dLeft =
- new DetWordAutom( left );
+ // (a) build *binding* nfa (sequential machine)
+ NondetWordAutom left = bbuild.automatonFrom( pat, IGNORED );
+ NondetWordAutom right = bbuild.revnfa;
- Matcher mL = new Matcher( _m.owner, _m.selector, null );
+ // (b) determinize + translate L
- LeftTracerInScala ltis =
- new LeftTracerInScala( dLeft, elementType, mL, cf);
+ DetWordAutom dLeft = new DetWordAutom( left );
- Tree stms[] = ltis.getTrace();
+ LeftTracerInScala ltis =
+ new LeftTracerInScala( dLeft, elementType, _m.owner, _m.selector, cf);
- Tree sel = gen.Ident( Position.FIRSTPOS, ltis.resultSym );
+ Tree stms[] = ltis.getTrace();
- // <- - - right
+ Tree theTrace = gen.Ident( cf.pos, ltis.resultSym );
- DetWordAutom dRight =
- new DetWordAutom( right, left, dLeft);
+ // (c) determinize + translate R
- //System.out.println( "vars: "+vars );
- int j;
+ DetWordAutom dRight = new DetWordAutom( right, left, dLeft );
- final RightTracerInScala rtis =
- new RightTracerInScala( dRight, left, mL,
- cf, pat, elementType );
+ Set seqVars = NondetWordAutom.collectVariables( left );
+ final RightTracerInScala rtis =
+ new RightTracerInScala( dRight, seqVars, _m.owner,
+ cf, pat, elementType );
- Tree stms2[] = rtis.getStms( sel ); // to scala
+ Tree stms2[] = rtis.getStms( theTrace );
- // run them, bind
+ // paste statements together
- Tree items[] = new Tree[ stms.length
- + stms2.length
- + 1 ];
+ Tree items[] = new Tree[ stms.length + stms2.length + 1 ];
- System.arraycopy( stms, 0, items, 0, stms.length );
- System.arraycopy( stms2, 0, items, stms.length, stms2.length );
+ System.arraycopy( stms, 0, items, 0, stms.length );
+ System.arraycopy( stms2, 0, items, stms.length, stms2.length );
- j = stms.length + stms2.length ;
- items[ stms.length + stms2.length ] = body;
+ items[ stms.length + stms2.length ] = body;
- Transformer treeCloner = new Transformer(unit.global) {
- public Tree transform(Tree tree) {
- tree = super.transform(tree);
- if (tree.hasSymbol()) {
- Object symbol = rtis.helpMap2.get(tree.symbol());
- if (symbol != null) tree.setSymbol((Symbol)symbol);
- }
- return tree;
+ Transformer treeCloner = new Transformer(unit.global) {
+ public Tree transform(Tree tree) {
+ tree = super.transform(tree);
+ if (tree.hasSymbol()) {
+ Object symbol = rtis.helpMap2.get(tree.symbol());
+ if (symbol != null) tree.setSymbol((Symbol)symbol);
}
- };
- //System.out.println("helpmap");
- //System.out.println( rtis.helpMap2 );
-
- items[ stms.length + stms2.length ] = treeCloner.transform( body );
- /*
- for( Iterator it = rtis.helpMap2.entrySet().iterator(); it.hasNext(); ) {
- Map.Entry e = (Map.Entry)it.next();
- Symbol key = (Symbol)e.getKey();
- Symbol val = (Symbol)e.getValue();
- val.setInfo( key.type() ); // !!! ?
- }
- */
- return gen.mkBlock( body.pos, items );
- }
-
- /** turns body `case pat(x,y,z) => body' into
- ** `{ <runLeft>;<runRight>;body }' if
- * necessary.
- * @param body the array containing the bodies of the visitor
- */
- Tree[] addBindersToBodies( Tree body[] ) {
- //System.out.println("addBindersToBodies");
- Tree nbody[] = new Tree[ body.length ];
- for( int i = 0; i < body.length; i++ ) {
- Integer iI = new Integer( i );
-
- if( !CollectVariableTraverser.containsBinding( pat[ i ] ) )
- {
- nbody[ i ] = body[ i ]; // no need for binding
- }
- else
- {
- nbody[ i ] =
- addBinderToBody( pat[ i ], body[ i ] );
- }
- }
- return nbody;
- }
- Type elementType ;
-
- /** constructs a word recognizer from an array of patterns which
- * should all be SequencePatterns ( no wildcard * )
- * precondition: pat.type corresponds to element type
- * @param _m Matcher object, holds the result
- * @param pat the (Sequence) patterns
- * @param body the bodies
- * @param defaultCase code that is run when nothing matches. may be null, it
- * becomes a ThrowMatchError then
-
- */
- public void construct( Matcher _m,
- Tree[] pat,
- Tree[] body,
- Tree defaultCase,
- boolean doBinding ) {
- this.pat = pat;
- this.body = body;
- assert body.length == pat.length;
- this._m = _m;
-
- this.cf = new CodeFactory( unit, _m.pos );
-
- Type seqType = pat[ 0 ].getType();
-
- elementType = cf.getElemType_Sequence( seqType );
-
- NondetWordAutom manyNfa[] = new NondetWordAutom[ pat.length ];
-
- BerrySethi build = new BerrySethi();
-
- for( int i = 0; i < pat.length; i++ )
- {
- manyNfa[ i ] = build.automatonFrom( pat[ i ],
- new Integer( i ));
- //manyNfa[ i ].print();
- }
-
- // merge nfas into one if necessary
-
- NondetWordAutom nfa =
- (pat.length > 1) ? new NondetWordAutom( manyNfa )
- : manyNfa[ 0 ];
-
- //nfa.print();
-
- DetWordAutom dfa = new DetWordAutom( nfa );
-
- WordAutomInScala scalaAut = new WordAutomInScala( _m.pos,
- dfa,
- elementType,
- _m.owner,
- cf,
- unit.global.target == Global.TARGET_JVM );
- scalaAut.translate();
-
- if( defaultCase == null )
- defaultCase = cf.ThrowMatchError( Position.FIRSTPOS, _m.resultType );
-
- Tree newbody[] = doBinding ? addBindersToBodies( body ): body;
-
- // FIXME - CODE FOR TESTING TUPLE STUFF
-
- _m.tree = scalaAut.getMatcherSwitch( _m.selector,
- defaultCase,
- newbody,
- _m.resultType );
- } // construct (Matcher, Tree[], Tree[], Tree, boolean )
+ return tree;
+ }
+ };
+ //System.out.println("helpmap");
+ //System.out.println( rtis.helpMap2 );
+
+ items[ stms.length + stms2.length ] = treeCloner.transform( body );
+ return gen.mkBlock( body.pos, items );
+ }
+
+ private NondetWordAutom[] buildNfas( Tree[] pat ) {
+ BerrySethi build = new BerrySethi();
+ NondetWordAutom manyNfa[] = new NondetWordAutom[ pat.length ];
+
+ for( int i = 0; i < pat.length; i++ ) {
+ manyNfa[ i ] = build.automatonFrom( pat[ i ],
+ new Integer( i ));
+ //manyNfa[ i ].print();
+ }
+ return manyNfa;
+ }
+
+ /** constructs a word recognizer from an array of patterns which
+ * should all be SequencePatterns ( no wildcard * )
+ * precondition: pat.type corresponds to element type
+ * @param _m Matcher object, holds the result
+ * @param pat the (Sequence) patterns
+ * @param body the bodies
+ * @param defaultCase code that is run when nothing matches. may be null, it
+ * becomes a ThrowMatchError then
+ * @param doBinding flasg that indicates whether variables should be bound
+ */
+ public void construct( Matcher _m,
+ Tree[] pat,
+ Tree[] body,
+ Tree defaultCase,
+ boolean doBinding ) {
+ this._m = _m;
+ //this.pat = pat;
+ //this.body = body;
+ assert body.length == pat.length;
+ if( defaultCase == null )
+ defaultCase = cf.ThrowMatchError( cf.pos, _m.resultType );
+
+ this.cf = new CodeFactory( unit, _m.pos );
+
+ Type seqType = pat[ 0 ].getType();
+ Type elementType = cf.getElemType_Sequence( seqType );
+
+ // STEP 1 - build nfas for each pattern
+
+ NondetWordAutom manyNfa[] = buildNfas( pat );
+
+ // STEP 2 - recognizing
+
+ // (a) merge nfas into one if necessary
+ NondetWordAutom nfa =
+ (pat.length > 1) ? new NondetWordAutom( manyNfa )
+ : manyNfa[ 0 ];
+ //nfa.print();
+
+ // (b) determinize
+ DetWordAutom dfa = new DetWordAutom( nfa );
+
+ // (c) translate to scala code
+ WordAutomInScala scalaAut = new WordAutomInScala( dfa,
+ elementType,
+ _m.owner,
+ cf,
+ unit.global.target == Global.TARGET_JVM );
+ scalaAut.translate();
+
+ // STEP 3 - binding
+
+ Tree newbody[];
+ if( !doBinding )
+ newbody = body;
+ else { // this is done in the body of the matching case
+ newbody = new Tree[body.length];
+ for( int i = 0; i < body.length; i++ )
+ if( !CollectVariableTraverser.containsBinding( pat[ i ] ) )
+ newbody[ i ] = body[ i ]; // no need for binding
+ else
+ newbody[ i ] = addBinderToBody( pat[ i ], body[ i ] );
+ }
+
+ _m.tree = scalaAut.getMatcherSwitch( _m.selector,
+ defaultCase,
+ newbody,
+ _m.resultType );
+ } // construct (Matcher, Tree[], Tree[], Tree, boolean )
/** constructor, invoked by AlgebraicMatcher
*/
- SequenceMatcher( Unit unit ) {
- super( unit );
- //Symbol predefSym = defs.getModule( defs.SCALA, Names.Predef );
- //Scope predefScope = predefSym.members();
- }
+ SequenceMatcher( Unit unit ) {
+ super( unit );
+ }
} // class SequenceMatcher
diff --git a/sources/scalac/transformer/matching/WordAutomInScala.java b/sources/scalac/transformer/matching/WordAutomInScala.java
index 1a3ad458df..41a276fa8b 100644
--- a/sources/scalac/transformer/matching/WordAutomInScala.java
+++ b/sources/scalac/transformer/matching/WordAutomInScala.java
@@ -16,7 +16,7 @@ import scalac.ast.TreeGen;
import scalac.symtab.Type;
import scalac.symtab.Symbol;
import scalac.transformer.TransMatch.Matcher;
-import scalac.typechecker.*;
+//import scalac.typechecker.*;
import Tree.*;
import java.util.*;
@@ -34,8 +34,8 @@ public class WordAutomInScala extends Autom2Scala {
Type resultType) {
Tree run = callFun( new Tree[] {
- cf.newIterator(selector),
- gen.mkIntLit(Position.FIRSTPOS, 0) } );
+ cf.newIterator( selector ),
+ gen.mkIntLit( cf.pos, 0 ) } );
/* return code `var <swres>: scala.Int = <init>' */
@@ -46,12 +46,12 @@ public class WordAutomInScala extends Autom2Scala {
// conditions
Tree cond[] = new Tree[body.length];
//Tree bbody[] = new Tree[body.length];
- for (int i = body.length - 1; i >= 0; i--)
- cond[i] = cf.Equals(_swres(), gen.mkIntLit(Position.FIRSTPOS, i));
+ for( int i = body.length - 1; i >= 0; i-- )
+ cond[i] = cf.Equals(_swres(), gen.mkIntLit( cf.pos, i ));
result = cf.Switch( selector, cond, body, failTree );
- result = cf.gen.mkBlock( pos, new Tree[] { theDefDef, run, result } );
+ result = cf.gen.mkBlock( cf.pos, new Tree[] { theDefDef, run, result } );
//unit.global.debugPrinter.print( result );
return result;
}
@@ -83,7 +83,7 @@ public class WordAutomInScala extends Autom2Scala {
return code_fail();
return callFun(new Tree[] { _iter(),
- gen.mkIntLit(Position.FIRSTPOS, target.intValue())} );
+ gen.mkIntLit( cf.pos, target.intValue() )} );
}
/** constructor
@@ -94,14 +94,12 @@ public class WordAutomInScala extends Autom2Scala {
* @param optim flag that indicates whether to optimize
* @return an object that translates the dfa
*/
- public WordAutomInScala(int pos,
- DetWordAutom dfa,
+ public WordAutomInScala(DetWordAutom dfa,
Type elementType,
Symbol owner,
CodeFactory cf,
boolean optim) {
super(dfa, elementType, owner, cf);
- this.pos = pos;
this.optimize &= optim;
}