summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2003-07-15 10:10:41 +0000
committerburaq <buraq@epfl.ch>2003-07-15 10:10:41 +0000
commit1be5d460df396a10228a5fbe415371dd3430a48d (patch)
tree2d4327ac9e7ba604c14988f1199f7722230b4dfd
parentc0a66221a6cfe62a4b5c8fec3e0050d8d8c9ada8 (diff)
downloadscala-1be5d460df396a10228a5fbe415371dd3430a48d.tar.gz
scala-1be5d460df396a10228a5fbe415371dd3430a48d.tar.bz2
scala-1be5d460df396a10228a5fbe415371dd3430a48d.zip
code-cleanup, refactoring, corrected multiple u...
code-cleanup, refactoring, corrected multiple use of the same symbol
-rw-r--r--sources/scalac/transformer/matching/Autom2Scala.java149
-rw-r--r--sources/scalac/transformer/matching/CodeFactory.java6
-rw-r--r--sources/scalac/transformer/matching/LeftTracerInScala.java503
-rw-r--r--sources/scalac/transformer/matching/RightTracerInScala.java71
4 files changed, 342 insertions, 387 deletions
diff --git a/sources/scalac/transformer/matching/Autom2Scala.java b/sources/scalac/transformer/matching/Autom2Scala.java
index ba2539ed09..19785e840e 100644
--- a/sources/scalac/transformer/matching/Autom2Scala.java
+++ b/sources/scalac/transformer/matching/Autom2Scala.java
@@ -19,6 +19,7 @@ import ch.epfl.lamp.util.Position;
public class Autom2Scala {
+ static final Name HASNEXT = Name.fromString("hasnext");
static final Name CURRENT_ELEM = Name.fromString("cur");
final int FAIL = -1;
@@ -126,6 +127,14 @@ public class Autom2Scala {
funSym,//clazzOwner,
0)
.setType( elementType );
+
+ this.hasnSym = new TermSymbol( /*Kinds.VAL, */
+ pos,
+ HASNEXT,
+ funSym,//clazzOwner,
+ 0)
+ .setType( defs.BOOLEAN_TYPE );
+
}
@@ -149,12 +158,20 @@ public class Autom2Scala {
public Tree theDefDef;
Symbol curSym;
-
- Tree loadCurrentElem() {
- return cf.Block( Position.NOPOS, new Tree[] {
- cf.gen.ValDef( 0,
- this.curSym,
- cf._next( _iter() )) }, Type.NoType );
+ Symbol hasnSym;
+
+ Tree loadCurrentElem( Tree body ) {
+ return cf.Block( Position.NOPOS, new Tree[] {
+ cf.gen.ValDef( 0,
+ this.hasnSym,
+ cf._hasNext( _iter() ) ),
+ cf.gen.ValDef( 0,
+ this.curSym,
+ cf.If( _ref( hasnSym ),//cf._hasNext( _iter() ),
+ cf._next( _iter() ),
+ cf.ignoreValue( curSym.type() ))),
+ body },
+ body.type() );
}
Tree currentElem() {
@@ -238,7 +255,9 @@ public class Autom2Scala {
for( int i = dfa.nstates-2; i >= 0; i-- ) {
body = code_state( i, body );
}
- return body;
+
+
+ return loadCurrentElem( body );
}
@@ -305,6 +324,17 @@ public class Autom2Scala {
return gen.mkIntLit(Position.NOPOS, FAIL );
}
+ /*
+ Tree ifInputHasNext() {
+ return cf.If( cf._hasNext( _iter() ),
+ cf.Block( stateBody.pos,
+ new Tree[] {
+ loadCurrentElem(),
+ stateBody},
+ stateBody.type()) );
+ }
+ */
+
Tree wrapStateBody0( Tree stateBody,
Tree elseBody,
int i ) {
@@ -313,78 +343,79 @@ public class Autom2Scala {
elseBody );
}
- // val cur := iter.cur()
+ // `val cur := iter.next()'
- Tree wrapStateBody( Tree stateBody,
- Tree elseBody,
- Tree runFinished, int i ) {
- stateBody = cf.If( cf._not_hasNext( _iter() ),
- runFinished,
- cf.Block( stateBody.pos,
- new Tree[] {
- loadCurrentElem(),
- stateBody},
- stateBody.type()) );
+ Tree wrapStateBody( Tree stateBody,
+ Tree elseBody,
+ Tree runFinished, int i ) {
+ stateBody = cf.If( cf.Negate( _ref( hasnSym )),//cf._not_hasNext( _iter() ),
+ runFinished,
+ stateBody);/*
+ cf.Block( stateBody.pos,
+ new Tree[] {
+ loadCurrentElem(),
+ stateBody},
+ stateBody.type()) );*/
- return wrapStateBody0( stateBody , elseBody, i );
- }
+ return wrapStateBody0( stateBody , elseBody, i );
+ }
- /** return code for state i of the dfa
- */
- Tree code_state( int i, Tree elseBody ) {
+ /** return code for state i of the dfa
+ */
+ Tree code_state( int i, Tree elseBody ) {
- Tree runFinished; // holds result of the run
- int finalSwRes;
+ Tree runFinished; // holds result of the run
+ int finalSwRes;
- runFinished = run_finished( i );
+ runFinished = run_finished( i );
- if( dfa.isSink( i ) ) // state won't change anymore (binding?)
- return cf.If( cf.Equals( _state(), gen.mkIntLit(Position.NOPOS, i )),
- runFinished,
- elseBody );
+ if( dfa.isSink( i ) ) // state won't change anymore (binding?)
+ return cf.If( cf.Equals( _state(), gen.mkIntLit(Position.NOPOS, i )),
+ runFinished,
+ elseBody );
- Tree stateBody ; // action(delta) for one particular label/test
+ Tree stateBody ; // action(delta) for one particular label/test
- // default action (fail if there is none)
+ // default action (fail if there is none)
- stateBody = code_delta( i, Label.DefaultLabel);
+ stateBody = code_delta( i, Label.DefaultLabel);
- /*
- if( stateBody == null )
- stateBody = code_fail();
- */
+ /*
+ if( stateBody == null )
+ stateBody = code_fail();
+ */
- // transitions of state i
+ // transitions of state i
- HashMap trans = ((HashMap[])dfa.deltaq)[ i ];
+ HashMap trans = ((HashMap[])dfa.deltaq)[ i ];
- for( Iterator labs = dfa.labels.iterator(); labs.hasNext() ; ) {
- Object label = labs.next();
- Integer next = (Integer) trans.get( label );
+ for( Iterator labs = dfa.labels.iterator(); labs.hasNext() ; ) {
+ Object label = labs.next();
+ Integer next = (Integer) trans.get( label );
- Tree action = code_delta( i, (Label) label );
+ Tree action = code_delta( i, (Label) label );
- if( action != null ) {
+ if( action != null ) {
- stateBody = cf.If( currentMatches((Label) label ),
- action,
- stateBody);
- }
- }
- return wrapStateBody( stateBody,
- elseBody,
- runFinished,
- i );
- }
+ stateBody = cf.If( currentMatches((Label) label ),
+ action,
+ stateBody);
+ }
+ }
+ return wrapStateBody( stateBody,
+ elseBody,
+ runFinished,
+ i );
+ }
- /** code to reference a variable
- */
- Tree _ref( Symbol sym ) {
- return gen.Ident( pos, sym );
- }
+ /** code to reference a variable
+ */
+ Tree _ref( Symbol sym ) {
+ return gen.Ident( pos, sym );
+ }
}
diff --git a/sources/scalac/transformer/matching/CodeFactory.java b/sources/scalac/transformer/matching/CodeFactory.java
index 033621c810..662e3c8c31 100644
--- a/sources/scalac/transformer/matching/CodeFactory.java
+++ b/sources/scalac/transformer/matching/CodeFactory.java
@@ -432,8 +432,8 @@ class CodeFactory extends PatternTool {
return make.Block(pos, ts).setType(tpe);
}
- /* // unused
- protected Tree Negate(Tree tree) {
+ // unused
+ public Tree Negate(Tree tree) {
switch (tree) {
case Literal(Object value):
return gen.mkBooleanLit(tree.pos, !((Boolean)value).booleanValue());
@@ -443,7 +443,7 @@ class CodeFactory extends PatternTool {
gen.Select(tree, NOT_N),
Tree.EMPTY_ARRAY).setType(defs.BOOLEAN_TYPE);
}
- */
+
protected Tree And(Tree left, Tree right) {
switch (left) {
case Literal(Object value):
diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java
index f9e02cf9d7..85e1e002eb 100644
--- a/sources/scalac/transformer/matching/LeftTracerInScala.java
+++ b/sources/scalac/transformer/matching/LeftTracerInScala.java
@@ -13,7 +13,7 @@ import java.util.* ;
import ch.epfl.lamp.util.Position;
-public class LeftTracerInScala extends Autom2Scala {
+public class LeftTracerInScala extends TracerInScala {
Tree selector;
@@ -34,337 +34,298 @@ public class LeftTracerInScala extends Autom2Scala {
Type elementType,
Matcher m,
CodeFactory cf ) {
- // ignore clazzOwner!
- super( dfa, elementType, m.owner, cf );
- this._m = m;
- this.selector = m.selector;
- helpMap = new HashMap();
- helpVarDefs = new Vector();
- }
-
-
- // SAME AS IN RightTracerInScala,
- // todo create common abstract superclass Tracer/TransducerInScala,
- // move WordAutom down.
- HashMap helpMap ;
- Vector helpVarDefs;
-
- Symbol makeHelpVar( Symbol realVar ) {
- Symbol helpVar = new TermSymbol( //Kinds.VAR,
- pos,
- cf.fresh.newName( realVar.name
- .toString() ),
- owner,
- 0)
- .setType( cf.SeqListType( elementType ) ) ;
+ super( dfa, elementType, m.owner, cf );
+ this._m = m;
+ this.selector = m.selector;
+ //helpMap = new HashMap(); moved up
+ helpVarDefs = new Vector();
- helpMap.put( realVar, helpVar );
-
- Tree varDef = gen.ValDef(helpVar, cf.newSeqNil( elementType ));
- //((ValDef) varDef).kind = Kinds.VAR;
- helpVarDefs.add( varDef );
- return helpVar;
}
- Symbol makeHelpVarSEQ( Tree pat ) {
- String helpName = String.valueOf( pat.hashCode() ); //wicked, in'it ?
- Symbol helpVar =
- new TermSymbol( /*Kinds.VAR, */pos,
- cf.fresh.newName(Name.fromString( helpName )),
- owner,
- 0)
- .setType( cf.SeqListType( pat.type() )) ;
-
- ValDef varDef = (ValDef) gen.ValDef( helpVar,
- cf.ignoreValue( cf.SeqListType( pat.type() )));
- //varDef.kind = Kinds.VAR;
- helpVarDefs.add( varDef );
- return helpVar;
- }
- // SAME AS RIGHT
- Tree refHelpVar( Symbol realVar ) {
- Symbol hv = (Symbol)helpMap.get( realVar );
- assert hv != null : realVar;
- return gen.Ident( Position.NOPOS, hv );
- }
-
- // SAME AS RIGHT
- Tree assignToHelpVar( Symbol realVar, Tree rhs ) {
- Tree hv = refHelpVar( realVar );
- return gen.Assign( hv, rhs );
- }
-
- void handleVars( Vector freeVars ) {
- for(Iterator it = freeVars.iterator(); it.hasNext(); ) {
- makeHelpVar( (Symbol) it.next() );
- }
+ // move WordAutom down.
+
+ Vector helpVarDefs;
+
+ Symbol makeHelpVar( Symbol realVar ) {
+ Symbol helpVar = new TermSymbol( pos,
+ cf.fresh.newName( realVar.name
+ .toString() ),
+ owner,
+ 0)
+ .setType( cf.SeqListType( elementType ) ) ;
+
+ helpMap.put( realVar, helpVar );
+
+ Tree varDef = gen.ValDef(helpVar, cf.newSeqNil( elementType ));
+ // set mutable flag of symbol helpVar ??
+ helpVarDefs.add( varDef );
+ return helpVar;
+ }
+
+ Symbol makeHelpVarSEQ( Tree pat ) {
+ String helpName = String.valueOf( pat.hashCode() ); //wicked, in'it ?
+ Symbol helpVar =
+ new TermSymbol( pos,
+ cf.fresh.newName(Name.fromString( helpName )),
+ owner,
+ 0)
+ .setType( cf.SeqListType( pat.type() )) ;
+
+ ValDef varDef = (ValDef) gen.ValDef( helpVar,
+ cf.ignoreValue( cf.SeqListType( pat.type() )));
+ helpVarDefs.add( varDef );
+ return helpVar;
+ }
+
+ void handleVars( Vector freeVars ) {
+ for(Iterator it = freeVars.iterator(); it.hasNext(); ) {
+ makeHelpVar( (Symbol) it.next() );
+ }
+ }
+
+ /** returns a Tree whose type is boolean.
+ * now we care about free vars
+ */
+ /*
+ Tree handleBody( HashMap helpMap ) {
+ Tree res[] = new Tree[ helpMap.keySet().size() + 1 ];
+ int j = 0;
+ for( Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
+ Symbol vsym = (Symbol) it.next();
+ Symbol hv = (Symbol) helpMap.get( vsym );
+ hv.type( cf.SeqListType( elementType ) ) ;
+ Tree refv = gen.Ident(Position.NOPOS, vsym);
+ Tree refhv = gen.Ident(Position.NOPOS, hv);
+ res[ j++ ] = gen.Assign( refhv, refv );
}
- Tree bindVar(Symbol realVar) {
- Tree hv = refHelpVar( realVar );
- System.out.println("realVar.name "+realVar.name+" type:"+realVar.type());
- if( realVar.type().isSameAs( elementType ))
- return gen.ValDef( realVar, cf.SeqList_head( hv ));
- else
- return gen.ValDef( realVar, hv);
+ res[ j ] = super.handleBody( freeVars ); // just `true'
+ return cf.Block(Position.NOPOS, res, res[j].type() );
}
+ */
+ protected void initializeSyms() {
+ funSymName = "leftTracer";
+ nestedMap = new HashMap();
- /** returns a Tree whose type is boolean.
- * now we care about free vars
- */
- /*
- Tree handleBody( HashMap helpMap ) {
- Tree res[] = new Tree[ helpMap.keySet().size() + 1 ];
- int j = 0;
- for( Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
- Symbol vsym = (Symbol) it.next();
- Symbol hv = (Symbol) helpMap.get( vsym );
- hv.type( cf.SeqListType( elementType ) ) ;
- Tree refv = gen.Ident(Position.NOPOS, vsym);
- Tree refhv = gen.Ident(Position.NOPOS, hv);
- res[ j++ ] = gen.Assign( refhv, refv );
- }
-
- res[ j ] = super.handleBody( freeVars ); // just `true'
-
- return cf.Block(Position.NOPOS, res, res[j].type() );
- }
-*/
- protected void initializeSyms() {
- funSymName = "leftTracer";
+ super.initializeSyms();
- nestedMap = new HashMap();
+ this.accumSym = newParam("accum") // accumulator
+ .setType( _accumType( elementType ));
- super.initializeSyms();
+ this.funSym
+ .setType( new Type.MethodType( new Symbol[] {
+ accumSym, iterSym, stateSym},
+ _accumType( elementType )));
- this.accumSym = newParam("accum") // accumulator
- .setType( _accumType( elementType ));
+ // 2 do: rename switchresultsym to something else...
- this.funSym
- .setType( new Type.MethodType( new Symbol[] {
- accumSym, iterSym, stateSym},
- _accumType( elementType )));
+ this.resultSym = new TermSymbol( //Kinds.VAR,
+ pos,
+ cf.fresh.newName("trace"),
+ owner,
+ 0 )
+ .setType( _accumType( elementType ) ) ;
- // 2 do: rename switchresultsym to something else...
+ }
- this.resultSym = new TermSymbol( //Kinds.VAR,
- pos,
- cf.fresh.newName("trace"),
- owner,
- 0 )
- .setType( _accumType( elementType ) ) ;
+ // should throw an exception here really, e.g. MatchError
+ Tree code_fail() {
+ return gen.Ident( accumSym.pos, accumSym );
- }
+ }
- /** do the translation
- public void translate() {
- initializeSyms();
- Tree tb = code_body();
- theDefDef = gen.DefDef( this.funSym,
- tb );
- }
- */
- // should throw an exception here really, e.g. MatchError
- Tree code_fail() {
- return gen.Ident( accumSym.pos, accumSym );
+ /** returns translation of transition with label from i.
+ * returns null if there is no such transition(no translation needed)
+ */
+ Tree code_delta( int i, Label label ) {
+ Integer target = dfa.delta( i, label );
+ /*
+ System.out.println("LeftTracer:calling dfa.delta("+i+","+label+")");
+ System.out.println("result: "+target);
+ */
+ if( target == null )
+ return null;
- }
+ // (optimization) that one is a dead state (does not make sense for tracer)
+ /*
+ if( target == dfa.nstates - 1 )
+ return code_fail();
+ */
+ Tree newAcc = cf.newSeqTraceCons(new Integer(i),
+ currentElem(),
+ _ref( accumSym ));
+ return callFun( new Tree[] { newAcc , _iter(), cf.Int( target )} );
+ }
- /** returns translation of transition with label from i.
- * returns null if there is no such transition(no translation needed)
- */
- Tree code_delta( int i, Label label ) {
- Integer target = dfa.delta( i, label );
- /*
- System.out.println("LeftTracer:calling dfa.delta("+i+","+label+")");
- System.out.println("result: "+target);
- */
- if( target == null )
- return null;
-
- // (optimization) that one is a dead state (does not make sense for tracer)
- /*
- if( target == dfa.nstates - 1 )
- return code_fail();
- */
- Tree newAcc = cf.newSeqTraceCons(new Integer(i),
- currentElem(),
- _ref( accumSym ));
-
- return callFun( new Tree[] { newAcc , _iter(), cf.Int( target )} );
- }
+ /** return code for state i of the dfa SAME AS IN SUPER, ONLY SINK IS GONE
+ */
+ Tree code_state( int i, Tree elseBody ) {
+ Tree runFinished; // holds result of the run
+ int finalSwRes;
- /** return code for state i of the dfa SAME AS IN SUPER, ONLY SINK IS GONE
- */
- Tree code_state( int i, Tree elseBody ) {
+ runFinished = run_finished( i );
- Tree runFinished; // holds result of the run
- int finalSwRes;
+ Tree stateBody ; // action(delta) for one particular label/test
- runFinished = run_finished( i );
+ // default action (fail if there is none)
- Tree stateBody ; // action(delta) for one particular label/test
+ stateBody = code_delta( i, Label.DefaultLabel);
- // default action (fail if there is none)
+ if( stateBody == null )
+ stateBody = code_fail();
+ // transitions of state i
- stateBody = code_delta( i, Label.DefaultLabel);
+ HashMap trans = ((HashMap[])dfa.deltaq)[ i ];
- if( stateBody == null )
- stateBody = code_fail();
- // transitions of state i
+ for( Iterator labs = ((HashMap)dfa.deltaq( i )).keySet().iterator();
+ labs.hasNext() ; ) {
+ Object label = labs.next();
+ Integer next = (Integer) trans.get( label );
- HashMap trans = ((HashMap[])dfa.deltaq)[ i ];
- for( Iterator labs = ((HashMap)dfa.deltaq( i )).keySet().iterator();
- labs.hasNext() ; ) {
- Object label = labs.next();
- Integer next = (Integer) trans.get( label );
+ Tree action = code_delta( i, (Label) label );
+ if( action != null ) {
- Tree action = code_delta( i, (Label) label );
+ stateBody = cf.If( _cur_eq( _iter(), (Label) label ),
+ action,
+ stateBody);
+ }
+ }
- if( action != null ) {
+ return wrapStateBody( stateBody,
+ elseBody,
+ runFinished,
+ i );
- stateBody = cf.If( _cur_eq( _iter(), (Label) label ),
- action,
- stateBody);
- }
- }
+ }
- return wrapStateBody( stateBody,
- elseBody,
- runFinished,
- i );
+ Tree[] getTrace() {
- }
+ initializeSyms();
+ Tree tb = code_body();
+ theDefDef = gen.DefDef( this.funSym,
+ tb );
- Tree[] getTrace() {
+ Vector v = new Vector();
- initializeSyms();
- Tree tb = code_body();
- theDefDef = gen.DefDef( this.funSym,
- tb );
+ v.addAll( helpVarDefs );
- Vector v = new Vector();
+ //
+ // `def leftTracer(...) = ...' the function definition
+ v.add( theDefDef );
- v.addAll( helpVarDefs );
+ Tree emptyAcc = cf._seqTraceNil( elementType );
- //
- // `def leftTracer(...) = ...' the function definition
- v.add( theDefDef );
+ // the valdef is needed, because passing emptyAcc as a parameter
+ // results in a ClassCastException at runtime (?!)
- Tree emptyAcc = cf._seqTraceNil( elementType );
+ Symbol emptyAccSym = new TermSymbol( pos,
+ cf.fresh.newName("acc"),
+ owner,
+ 0 )
+ .setType( _accumType( elementType ) ) ;
- // the valdef is needed, because passing emptyAcc as a parameter
- // results in a ClassCastException at runtime (?!)
+ // `val acc = SeqNil[ elementType ]' init accumulator
+ v.add( gen.ValDef( pos, emptyAccSym, emptyAcc) );
- Symbol emptyAccSym = new TermSymbol( //Kinds.VAR,
- pos,
- cf.fresh.newName("acc"),
- owner,
- 0 )
- .setType( _accumType( elementType ) ) ;
+ Tree run = callFun( new Tree[] {
+ gen.Ident( pos, emptyAccSym ),
+ cf.newIterator( selector, selector.type() ),
+ cf.Int( 0 ) });
- // `val acc = SeqNil[ elementType ]' init accumulator
- v.add( gen.ValDef( pos, emptyAccSym, emptyAcc) );
+ run = gen.ValDef( Position.NOPOS, resultSym, run );
- Tree run = callFun( new Tree[] {
- gen.Ident( pos, emptyAccSym ),
- cf.newIterator( selector, selector.type() ),
- cf.Int( 0 ) });
+ v.add( run );
- run = gen.ValDef( Position.NOPOS, resultSym, run );
+ // vars...
+ for( Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
+ v.add( bindVar( (Symbol) it.next()) );
+ }
- v.add( run );
+ /* IF YOU NEED DEBUG OUTPUT AT RUNTIME
+ v.add( cf.debugPrintRuntime( "the trace is" ) );
+ v.add( cf.debugPrintRuntime( gen.Ident( pos, resultSym ) ) );
+ v.add( cf.debugPrintNewlineRuntime( "" ) );
+ */
- // vars...
- for( Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
- v.add( bindVar( (Symbol) it.next()) );
- }
+ Tree res[] = new Tree[ v.size() ];
+ int j = 0;
+ for( Iterator it = v.iterator(); it.hasNext(); )
+ res[ j++ ] = (Tree) it.next();
- /* IF YOU NEED DEBUG OUTPUT AT RUNTIME
- v.add( cf.debugPrintRuntime( "the trace is" ) );
- v.add( cf.debugPrintRuntime( gen.Ident( pos, resultSym ) ) );
- v.add( cf.debugPrintNewlineRuntime( "" ) );
- */
+ _m.varMap = nestedMap;
- Tree res[] = new Tree[ v.size() ];
- int j = 0;
- for( Iterator it = v.iterator(); it.hasNext(); )
- res[ j++ ] = (Tree) it.next();
+ return res;
- _m.varMap = 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);
- public HashMap nestedMap;
-
- // calling the AlgebraicMatcher here
- Tree _cur_match( Tree pat ) {
- //System.out.println("calling algebraic matcher on type:"+pat.type);
-
- Matcher m = new Matcher( funSym,
- currentElem(),
- defs.BOOLEAN_TYPE );
-
- if( CollectVariableTraverser.containsBinding( pat )) {
- switch( pat ) {
- case Sequence(Tree[] pats):
- //System.out.println("ouch! v Left");
- Symbol hv = makeHelpVarSEQ( pat );
- nestedMap.put( pat, hv );
- Tree stm = gen.Assign( gen.Ident(0, hv), currentElem() );
- m.stms = new Tree[2];
- m.stms[0] = stm;
- m.stms[1] = gen.mkBooleanLit(Position.NOPOS, true);
- return cf.Block( 0, m.stms, m.stms[1].type() );
- }
- }
-
- HashMap helpMap = FreshVariableTraverser.getVars( pat, owner, cf.fresh );
- //System.out.println("varMap: "+helpMap );
-
- m.varMap = helpMap;
-
- //replaceVars( pat );
-
- am.construct( m, new CaseDef[] {
- (CaseDef) cf.make.CaseDef( pat.pos,
- pat,
- Tree.Empty,
- handleBody( helpMap )),
- (CaseDef) cf.make.CaseDef( pat.pos,
- cf.make.Ident(pat.pos, Names.WILDCARD)
- //.setSymbol( Symbol.NONE ) FIXED
- .setType(pat.type()),
- Tree.Empty,
- gen.mkBooleanLit(Position.NOPOS, false)) },
- false
- );
- Tree res = am.toTree().setType( defs.BOOLEAN_TYPE );
- //System.out.println("freeVars: "+freeVars);
-
- return res;
- }
+ Matcher m = new Matcher( funSym,
+ currentElem(),
+ defs.BOOLEAN_TYPE );
+ if( CollectVariableTraverser.containsBinding( pat )) {
+ switch( pat ) {
+ case Sequence(Tree[] pats):
+ //System.out.println("ouch! v Left");
+ Symbol hv = makeHelpVarSEQ( pat );
+ nestedMap.put( pat, hv );
+ Tree stm = gen.Assign( gen.Ident(0, hv), currentElem() );
+ m.stms = new Tree[2];
+ m.stms[0] = stm;
+ m.stms[1] = gen.mkBooleanLit(Position.NOPOS, true);
+ return cf.Block( 0, m.stms, m.stms[1].type() );
+ }
+ }
- /** return the accumulator + last state
- */
- Tree run_finished( int state ) {
- return cf.newSeqTraceCons(new Integer( state ),
- cf.ignoreValue( elementType ),
- _ref( accumSym ));
- }
+ HashMap helpMap = FreshVariableTraverser.getVars( pat, owner, cf.fresh );
+ //System.out.println("varMap: "+helpMap );
+
+ m.varMap = helpMap;
+
+ //replaceVars( pat );
+
+ am.construct( m, new CaseDef[] {
+ (CaseDef) cf.make.CaseDef( pat.pos,
+ pat,
+ Tree.Empty,
+ handleBody( helpMap )),
+ (CaseDef) cf.make.CaseDef( pat.pos,
+ cf.make.Ident(pat.pos, Names.WILDCARD)
+ //DON'T .setSymbol( Symbol.NONE ) !
+ .setType(pat.type()),
+ Tree.Empty,
+ gen.mkBooleanLit(Position.NOPOS, false)) },
+ false
+ );
+ Tree res = am.toTree().setType( defs.BOOLEAN_TYPE );
+ //System.out.println("freeVars: "+freeVars);
+
+ return res;
+ }
+
+
+ /** return the accumulator + last state
+ */
+ Tree run_finished( int state ) {
+ return cf.newSeqTraceCons(new Integer( state ),
+ cf.ignoreValue( elementType ),
+ _ref( accumSym ));
+ }
}
diff --git a/sources/scalac/transformer/matching/RightTracerInScala.java b/sources/scalac/transformer/matching/RightTracerInScala.java
index 3ae2854860..1ed0b69864 100644
--- a/sources/scalac/transformer/matching/RightTracerInScala.java
+++ b/sources/scalac/transformer/matching/RightTracerInScala.java
@@ -17,7 +17,7 @@ import scalac.util.Names ;
import ch.epfl.lamp.util.Position;
-public class RightTracerInScala extends Autom2Scala {
+public class RightTracerInScala extends TracerInScala {
//Scope scp;
//Symbol vars[];
@@ -27,6 +27,15 @@ public class RightTracerInScala extends Autom2Scala {
Matcher _m;
+ // Symbol funSym;
+
+ Symbol elemSym;
+ Symbol targetSym;
+
+ HashMap helpMap2 ;
+ Vector helpVarDefs;
+
+
/** translate right tracer to code
* @param dfa determinized left tracer
* @param left nondeterm. left tracer
@@ -43,7 +52,6 @@ public class RightTracerInScala extends Autom2Scala {
super( dfa, elementType, m.owner, cf );
this._m = m;
-
Vector seqVars = new Vector();
for( int j = 0; j < left.nstates; j++ ) {
@@ -60,7 +68,6 @@ public class RightTracerInScala extends Autom2Scala {
this.seqVars = seqVars;
this.allVars = CollectVariableTraverser.collectVars( pat );
- helpMap = new HashMap();
helpMap2 = new HashMap();
helpVarDefs = new Vector();
@@ -78,15 +85,6 @@ public class RightTracerInScala extends Autom2Scala {
initializeSyms();
}
- // Symbol funSym;
-
- Symbol elemSym;
- Symbol targetSym;
-
- HashMap helpMap ;
- HashMap helpMap2 ;
- Vector helpVarDefs;
-
void makeHelpVar( Symbol realVar ) {
makeHelpVar( realVar, false );
}
@@ -121,12 +119,6 @@ public class RightTracerInScala extends Autom2Scala {
}
- Tree refHelpVar( Symbol realVar ) {
- Symbol hv = (Symbol)helpMap.get( realVar );
- assert hv != null : realVar;
- return gen.Ident(Position.NOPOS, hv);
- }
-
Tree prependToHelpVar( Symbol realVar, Tree elem ) {
Tree hv = refHelpVar( realVar );
return gen.Assign( hv, cf.newSeqCons( elem, hv ));
@@ -139,44 +131,29 @@ public class RightTracerInScala extends Autom2Scala {
*/
}
- Tree bindVar(Symbol realVar) {
- Tree hv = refHelpVar( realVar );
- //System.out.println("binding realVar.name "+realVar.name+" type:"+realVar.type()+" to smth");
- realVar.setOwner( owner );
- if( realVar.type().isSameAs( elementType ))
- return gen.ValDef( realVar, cf.SeqList_head( hv ));
- else
- return gen.ValDef( realVar, hv);
-
- }
-
protected void initializeSyms() {
this.funSym = newFunSym( "binder" );
- this.iterSym = new TermSymbol( //Kinds.VAL,
- pos,
+ this.iterSym = new TermSymbol( pos,
cf.fresh.newName("iter"),
funSym,
0)
.setType( cf.SeqTraceType( elementType ));
- this.stateSym = new TermSymbol( //Kinds.VAL,
- pos,
+ this.stateSym = new TermSymbol( pos,
cf.fresh.newName("q"),
funSym,
0 )
.setType( defs.INT_TYPE ) ;
- this.elemSym = new TermSymbol( //Kinds.VAL,
- pos,
+ this.elemSym = new TermSymbol( pos,
cf.fresh.newName("elem"),
funSym,
0)
.setType( elementType ) ;
- this.targetSym = new TermSymbol( //Kinds.VAL,
- pos,
+ this.targetSym = new TermSymbol( pos,
cf.fresh.newName("trgt"),
funSym,
0)
@@ -340,9 +317,6 @@ public class RightTracerInScala extends Autom2Scala {
this.helpMap2.put( key, helpMap.get( key ));
}
- // find this weird ? pattern matcher expects var. symbol for _ pattern FIXME ?!! CANNOT BE TRUE
- //Symbol obfuscvble = new TermSymbol(0, Name.fromString("ga$ga$ga$"), _m.owner, 0).setType( pat.type() );
-
am.construct( m, new CaseDef[] {
(CaseDef) cf.make.CaseDef( pat.pos,
pat,
@@ -350,7 +324,7 @@ public class RightTracerInScala extends Autom2Scala {
handleBody( helpMap2 )),
(CaseDef) cf.make.CaseDef( pat.pos,
cf.make.Ident(pat.pos, Names.WILDCARD)
- //.setSymbol( Symbol.NONE ) FIXED
+ //DON'T .setSymbol( Symbol.NONE ) !!FIXED
.setType( pat.type() ),
Tree.Empty,
gen.mkBooleanLit( pat.pos, false )) },
@@ -405,11 +379,7 @@ public class RightTracerInScala extends Autom2Scala {
for( Iterator it = vars.iterator(); it.hasNext(); ) {
Symbol var = (Symbol) it.next();
- /*Tree field = gen.Select( gen.Ident( pos, accumSym ),
- var.name ).setSymbol( var );
- */
- //Tree field = gen.Ident( pos, var );
- Tree rhs = gen.Ident( pos, elemSym ); //cf._cur( _iter() );
+ Tree rhs = gen.Ident( pos, elemSym );
stms[ j++ ] = prependToHelpVar( var , rhs);
}
@@ -437,7 +407,6 @@ public class RightTracerInScala extends Autom2Scala {
v.add( gen.DefDef( this.funSym, code_body() ) );
v.add( callFun( new Tree[] { trace, cf.Int( 0 ) } ) );
-
/*
for(Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
// DEBUG
@@ -464,16 +433,10 @@ public class RightTracerInScala extends Autom2Scala {
}
/** return the accumulator. (same as in LeftTracerInScala)
+ * todo: move tree generation of Unit somewhere else
*/
Tree run_finished( int state ) {
- //return gen.Ident( accumSym.pos, accumSym );
return gen.Block(0, Tree.EMPTY_ARRAY).setType( defs.UNIT_TYPE );
- /* gen.Ident(0, defs.NULL); */
- /*gen.New( pos, defs.SCALA_TYPE, defs.NULL, //UNIT_CLASS,
- Type.EMPTY_ARRAY,
- Tree.EMPTY_ARRAY); */
-
-
}
Tree current() {