From 1be5d460df396a10228a5fbe415371dd3430a48d Mon Sep 17 00:00:00 2001 From: buraq Date: Tue, 15 Jul 2003 10:10:41 +0000 Subject: code-cleanup, refactoring, corrected multiple u... code-cleanup, refactoring, corrected multiple use of the same symbol --- .../scalac/transformer/matching/Autom2Scala.java | 149 +++--- .../scalac/transformer/matching/CodeFactory.java | 6 +- .../transformer/matching/LeftTracerInScala.java | 503 ++++++++++----------- .../transformer/matching/RightTracerInScala.java | 71 +-- 4 files changed, 342 insertions(+), 387 deletions(-) (limited to 'sources') 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() { -- cgit v1.2.3