diff options
author | buraq <buraq@epfl.ch> | 2004-01-07 14:29:12 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2004-01-07 14:29:12 +0000 |
commit | a1c71f91578a3a25212b856379549d5d5107328e (patch) | |
tree | 546e689dd196c3eba7b80152287b2fef9b572fc4 /sources | |
parent | 71cd266cd4db5956ed2e74e7a600518ed6a4638b (diff) | |
download | scala-a1c71f91578a3a25212b856379549d5d5107328e.tar.gz scala-a1c71f91578a3a25212b856379549d5d5107328e.tar.bz2 scala-a1c71f91578a3a25212b856379549d5d5107328e.zip |
cleanup
Diffstat (limited to 'sources')
4 files changed, 359 insertions, 380 deletions
diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java index ead1164f1e..970380a506 100644 --- a/sources/scalac/transformer/matching/LeftTracerInScala.java +++ b/sources/scalac/transformer/matching/LeftTracerInScala.java @@ -15,32 +15,31 @@ import ch.epfl.lamp.util.Position; public class LeftTracerInScala extends TracerInScala { - Tree selector; + Tree selector; - /** symbol of the accumulator ( scala.SequenceList ) - */ - Symbol accumSym; - Type accumType; - Type accumTypeArg; + /** symbol of the accumulator ( scala.SequenceList ) + */ + Symbol accumSym; + Type accumType; + Type accumTypeArg; - Type _accumType( Type elemType ) { - return cf.SeqTraceType( elemType ); - } + Type _accumType( Type elemType ) { + return cf.SeqTraceType( elemType ); + } - Matcher _m ; - public LeftTracerInScala( DetWordAutom dfa, - Type elementType, - Matcher m, - CodeFactory cf ) { + Matcher _m ; + public LeftTracerInScala( DetWordAutom dfa, + Type elementType, + Matcher m, + CodeFactory cf ) { - super( dfa, elementType, m.owner, cf ); - this._m = m; - this.selector = m.selector; - //helpMap = new HashMap(); moved up - helpVarDefs = new Vector(); + super( dfa, elementType, m.owner, cf ); + this._m = m; + this.selector = m.selector; + helpVarDefs = new Vector(); - } + } Vector helpVarDefs; @@ -72,7 +71,6 @@ public class LeftTracerInScala extends TracerInScala { Tree varDef = gen.ValDef( helpVar, gen.mkDefaultValue( cf.pos, defs.LIST_TYPE( pat.getType() )) - //cf.ignoreValue( ) ); helpVarDefs.add( varDef ); return helpVar; @@ -96,18 +94,17 @@ public class LeftTracerInScala extends TracerInScala { // 2 do: rename switchresultsym to something else... - this.resultSym = new TermSymbol( //Kinds.VAR, - pos, + this.resultSym = new TermSymbol(pos, cf.fresh.newName("trace"), owner, 0 ) .setType( accumType ) ; } - // should throw an exception here really, e.g. MatchError + /* 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. @@ -129,9 +126,9 @@ public class LeftTracerInScala extends TracerInScala { */ /* - Tree newAcc = cf.newSeqTraceCons(new Integer(i), - currentElem(), - _ref( accumSym )); + Tree newAcc = cf.newSeqTraceCons(new Integer(i), + currentElem(), + _ref( accumSym )); */ Tree hd = cf.newPair( gen.mkIntLit(cf.pos, i), currentElem() ); Tree newAcc = gen.Cons(cf.pos, @@ -143,13 +140,9 @@ public class LeftTracerInScala extends TracerInScala { } - Tree switchDefaultCase() { - return gen.Nil( cf.pos ); - } - public Tree code_body() { - Tree body = code_fail(); // never reached at runtime. + Tree body = code_error(); // never reached at runtime. // state [ nstates-1 ] is the dead state, so we skip it @@ -191,7 +184,7 @@ public class LeftTracerInScala extends TracerInScala { Tree action = code_delta( i, (Label) label ); if( action != null ) { - stateBody = gen.If( currentMatches((Label) label),// _cur_eq( _iter(), (Label) label ), + stateBody = gen.If( currentMatches((Label) label), action, stateBody); } @@ -209,8 +202,8 @@ public class LeftTracerInScala extends TracerInScala { initializeSyms(); //Tree tb = code_body(); Tree tb = code_body_NEW(); - theDefDef = gen.DefDef( this.funSym, - tb ); + Tree theDefDef = gen.DefDef( this.funSym, + tb ); Vector v = new Vector(); @@ -248,10 +241,9 @@ public class LeftTracerInScala extends TracerInScala { v.add( bindVar( (Symbol) 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( "" ) ); + /* DEBUG OUTPUT AT RUNTIME + v.add( gen.Console...( "the trace is" ) ); + v.add( gen.Console...( gen.Ident( pos, resultSym ) ) ); */ Tree res[] = new Tree[ v.size() ]; @@ -301,7 +293,7 @@ public class LeftTracerInScala extends TracerInScala { gen.mkBooleanLit( cf.pos, true )), cf.gen.CaseDef( cf.gen.Ident(pat.pos, defs.PATTERN_WILDCARD), gen.mkBooleanLit( cf.pos, false)) }, - false); + false); Tree res = am.toTree(); return res; } diff --git a/sources/scalac/transformer/matching/RightTracerInScala.java b/sources/scalac/transformer/matching/RightTracerInScala.java index 544ca6a64c..2e25965e55 100644 --- a/sources/scalac/transformer/matching/RightTracerInScala.java +++ b/sources/scalac/transformer/matching/RightTracerInScala.java @@ -23,9 +23,6 @@ import ch.epfl.lamp.util.Position; public class RightTracerInScala extends TracerInScala { - //Scope scp; - //Symbol vars[]; - Vector seqVars; Vector allVars; @@ -45,125 +42,125 @@ public class RightTracerInScala extends TracerInScala { * @param elementType ... */ public RightTracerInScala( DetWordAutom dfa, - NondetWordAutom left, - Matcher m, - 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 ); - } - } - - this.seqVars = seqVars; - this.allVars = CollectVariableTraverser.collectVars( pat ); - - helpMap2 = new HashMap(); - helpVarDefs = new Vector(); - - for( Iterator it = seqVars.iterator(); it.hasNext(); ) { - makeHelpVar( (Symbol) it.next() ); - } - - for( Iterator it = allVars.iterator(); it.hasNext(); ) { - Symbol varSym = (Symbol) it.next(); - if( !seqVars.contains( varSym )) { - makeHelpVar( varSym, true ); - } - } - - initializeSyms(); + NondetWordAutom left, + Matcher m, + 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 ); + } + } + + this.seqVars = seqVars; + this.allVars = CollectVariableTraverser.collectVars( pat ); + + helpMap2 = new HashMap(); + helpVarDefs = new Vector(); + + for( Iterator it = seqVars.iterator(); it.hasNext(); ) { + makeHelpVar( (Symbol) it.next() ); + } + + for( Iterator it = allVars.iterator(); it.hasNext(); ) { + Symbol varSym = (Symbol) it.next(); + if( !seqVars.contains( varSym )) { + makeHelpVar( varSym, true ); + } + } + + initializeSyms(); } void makeHelpVar( Symbol realVar ) { - makeHelpVar( realVar, false ); + makeHelpVar( realVar, false ); } /** makes a helpvar and puts mapping into helpMap, ValDef into helpVarDefs */ void makeHelpVar( Symbol realVar, boolean keepType ) { - Symbol helpVar = new TermSymbol( pos, - cf.fresh.newName( realVar.name - .toString() ), - owner, - 0); + Symbol helpVar = new TermSymbol( pos, + cf.fresh.newName( realVar.name + .toString() ), + owner, + 0); - //System.out.println("making helpvar : "+realVar+" -> "+helpVar); + //System.out.println("making helpvar : "+realVar+" -> "+helpVar); - if( keepType ) - helpVar.setType( realVar.type() ); - else - helpVar.setType( defs.LIST_TYPE(elementType) ); + if( keepType ) + helpVar.setType( realVar.type() ); + else + helpVar.setType( defs.LIST_TYPE(elementType) ); - helpMap.put( realVar, helpVar ); + helpMap.put( realVar, helpVar ); - Tree rhs; - if( keepType ) - rhs = gen.mkDefaultValue( cf.pos, realVar.type() ); - else - rhs = gen.Nil( cf.pos ); - helpVar.flags |= Modifiers.MUTABLE; - Tree varDef = gen.ValDef( helpVar, rhs ); - //((ValDef) varDef).kind = Kinds.VAR; - helpVarDefs.add( varDef ); + Tree rhs; + if( keepType ) + rhs = gen.mkDefaultValue( cf.pos, realVar.type() ); + else + rhs = gen.Nil( cf.pos ); + helpVar.flags |= Modifiers.MUTABLE; + Tree varDef = gen.ValDef( helpVar, rhs ); + //((ValDef) varDef).kind = Kinds.VAR; + helpVarDefs.add( varDef ); } Tree prependToHelpVar( Symbol realVar, Tree elem ) { - Tree hv = refHelpVar( realVar ); - return gen.Assign( hv, gen.Cons( cf.pos, elementType, elem, hv )); - /* - return cf.Block(pos, - new Tree [] { - cf.debugPrintRuntime( "ASSIGN" ), - gen.Assign( hv, cf.newSeqCons( elem, hv )) - }, defs.UNIT_TYPE()); - */ + Tree hv = refHelpVar( realVar ); + return gen.Assign( hv, gen.Cons( cf.pos, elementType, elem, hv )); + /* + return cf.Block(pos, + new Tree [] { + cf.debugPrintRuntime( "ASSIGN" ), + gen.Assign( hv, cf.newSeqCons( elem, hv )) + }, defs.UNIT_TYPE()); + */ } protected void initializeSyms() { - this.funSym = newFunSym( "binder" ); + this.funSym = newFunSym( "binder" ); - this.iterSym = new TermSymbol( pos, - cf.fresh.newName("iter"), - funSym, - Modifiers.PARAM ) - .setType( cf.SeqTraceType( elementType )); + this.iterSym = new TermSymbol( pos, + cf.fresh.newName("iter"), + funSym, + Modifiers.PARAM ) + .setType( cf.SeqTraceType( elementType )); - this.stateSym = new TermSymbol( pos, - cf.fresh.newName("q"), - funSym, - Modifiers.PARAM ) - .setType( defs.INT_TYPE() ) ; + this.stateSym = new TermSymbol( pos, + cf.fresh.newName("q"), + funSym, + Modifiers.PARAM ) + .setType( defs.INT_TYPE() ) ; - this.curSym = new TermSymbol( pos, - cf.fresh.newName("elem"), - funSym, - 0) - .setType( elementType ) ; + this.curSym = new TermSymbol( pos, + cf.fresh.newName("elem"), + funSym, + 0) + .setType( elementType ) ; - this.targetSym = new TermSymbol( pos, - cf.fresh.newName("trgt"), - funSym, - 0) - .setType( defs.INT_TYPE() ) ; + this.targetSym = new TermSymbol( pos, + cf.fresh.newName("trgt"), + funSym, + 0) + .setType( defs.INT_TYPE() ) ; - funSym.setType( new Type.MethodType( new Symbol[] { - iterSym, stateSym }, defs.UNIT_TYPE() )); + funSym.setType( new Type.MethodType( new Symbol[] { + iterSym, stateSym }, defs.UNIT_TYPE() )); } @@ -181,58 +178,50 @@ public class RightTracerInScala extends TracerInScala { )}); } - // same as in LeftTracer - Tree code_fail() { - return gen.Block( new Tree[] { - gen.Console_print( pos, "System error during pattern matching. Please file bug report\n"), - cf.ThrowMatchError( _m.pos, defs.UNIT_TYPE() ) - }); - } - /* - public Tree code_body() { - - Tree body = code_fail(); // 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; - } -*/ + 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 - return gen.If( cf.Equals( _state(), gen.mkIntLit( cf.pos, 0 )), - code_state0_NEW(), - elseBody ); + return gen.If( cf.Equals( _state(), gen.mkIntLit( cf.pos, 0 )), + code_state0_NEW(), + elseBody ); } @@ -241,17 +230,17 @@ public class RightTracerInScala extends TracerInScala { */ Tree code_state0_NEW() { // careful, map Int to Int - HashMap hmap = (HashMap) dfa.deltaq( 0 ); // all the initial states + HashMap hmap = (HashMap) dfa.deltaq( 0 ); // all the initial states int i = 0; final int n = hmap.keySet().size(); // all transitions defined TreeMap tmapTag = new TreeMap(); TreeMap tmapBody = new TreeMap(); - for( Iterator it = hmap.keySet().iterator(); it.hasNext(); i++) { + for( Iterator it = hmap.keySet().iterator(); it.hasNext(); i++) { - Integer targetL = (Integer) it.next(); - Integer targetR = (Integer) hmap.get( targetL ); + Integer targetL = (Integer) it.next(); + Integer targetR = (Integer) hmap.get( targetL ); Integer I = new Integer( i ); tmapTag.put( targetL, I ); @@ -259,7 +248,7 @@ public class RightTracerInScala extends TracerInScala { cf.SeqTrace_tail( _iter() ), gen.mkIntLit( cf.pos, targetR ) })); - } + } i = 0; int[] tags = new int[ n ]; Tree[] targets = new Tree[ n ]; @@ -269,45 +258,45 @@ 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_fail()/*cannot happen*/ ); + return gen.Switch( gen.Ident( pos, targetSym ), tags, targets, code_error()/*cannot happen*/ ); } Tree currentMatches( Label label ) { - switch( label ) { - case Pair( Integer target, Label theLab ): - return cf.Equals( gen.mkIntLit( cf.pos, target ), - current() ); - } - throw new ApplicationError("expected Pair label"); + switch( label ) { + case Pair( Integer target, Label theLab ): + return cf.Equals( gen.mkIntLit( cf.pos, target ), + current() ); + } + throw new ApplicationError("expected Pair label"); } Tree code_state_NEW( int i ) { // precondition i != 0 - Tree stateBody = code_delta( i, Label.DefaultLabel ); + Tree stateBody = code_delta( i, Label.DefaultLabel ); if( stateBody == null ) - stateBody = code_fail(); - HashMap trans = ((HashMap[])dfa.deltaq)[ i ]; + stateBody = code_error(); + HashMap trans = ((HashMap[])dfa.deltaq)[ i ]; TreeMap tmapTag = new TreeMap(); TreeMap tmapBody = new TreeMap(); - int j = 0; - for( Iterator labs = dfa.labels.iterator(); labs.hasNext(); j++) { - Object label = labs.next(); - Integer next = (Integer) trans.get( label ); + int j = 0; + for( Iterator labs = dfa.labels.iterator(); labs.hasNext(); j++) { + 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 ) { Integer J = new Integer( j ); tmapTag.put( ((Label.Pair) label).state, J ); tmapBody.put( J, action ); - stateBody = gen.If( currentMatches((Label) label ), - action, - stateBody); - } - } + stateBody = gen.If( currentMatches((Label) label ), + action, + stateBody); + } + } final int n = tmapTag.keySet().size(); j = 0; int[] tags = new int[ n ]; @@ -320,146 +309,144 @@ public class RightTracerInScala extends TracerInScala { } if( n > 0 ) { actionsPresent = true; - return gen.Switch( gen.Ident( pos, targetSym ), tags, targets, code_fail()/*cannot happen*/ ); + return gen.Switch( gen.Ident( pos, targetSym ), tags, targets, code_error()/*cannot happen*/ ); } else - return code_fail(); + return code_error(); } /** returns a Tree whose type is boolean. * now we care about free vars */ - Tree handleBody1( HashMap helpMap3 ) { - //System.out.println("Rtis.handleBody ... helpMap = " + helpMap ); - // todo: change helpMap s.t. symbols are not reused. - - Tree res[] = new Tree[ helpMap3.keySet().size() + 1 ]; - int j = 0; - for( Iterator it = helpMap3.keySet().iterator(); it.hasNext(); ) { - Symbol vsym = (Symbol) it.next(); - Symbol hv = (Symbol) helpMap3.get( vsym ); - hv.setType( defs.LIST_TYPE( elementType ) ) ; - Tree refv = gen.Ident(Position.FIRSTPOS, vsym); - Tree refhv = gen.Ident(Position.FIRSTPOS, hv); - res[ j++ ] = gen.Assign( refhv, refv ); - } - - res[ j ] = gen.mkBooleanLit( Position.FIRSTPOS, true ); // just `true' - - return gen.mkBlock(res); + //System.out.println("Rtis.handleBody ... helpMap = " + helpMap ); + // todo: change helpMap s.t. symbols are not reused. + + Tree res[] = new Tree[ helpMap3.keySet().size() + 1 ]; + int j = 0; + for( Iterator it = helpMap3.keySet().iterator(); it.hasNext(); ) { + Symbol vsym = (Symbol) it.next(); + Symbol hv = (Symbol) helpMap3.get( vsym ); + hv.setType( defs.LIST_TYPE( elementType ) ) ; + Tree refv = gen.Ident(Position.FIRSTPOS, vsym); + Tree refhv = gen.Ident(Position.FIRSTPOS, hv); + res[ j++ ] = gen.Assign( refhv, refv ); + } + + res[ j ] = gen.mkBooleanLit( Position.FIRSTPOS, true ); // just `true' + + return gen.mkBlock(res); } // calling the AlgebraicMatcher here Tree _cur_match( Tree pat ) { - //System.out.println("RTiS._cur_match("+pat.toString()+")"); + //System.out.println("RTiS._cur_match("+pat.toString()+")"); + //System.out.println("calling algebraic matcher on type:"+pat.type); - //System.out.println("calling algebraic matcher on type:"+pat.type); + Matcher m = new Matcher( funSym,//this.funSym, + currentElem(), + defs.BOOLEAN_TYPE() ); - Matcher m = new Matcher( funSym,//this.funSym, - currentElem(), - defs.BOOLEAN_TYPE() ); + // there could be variables in regular expressions under Sequence + // node, export those later (?!WHY?!) - // there could be variables in regular expressions under Sequence node, - // export those later - Vector varsToExport = NoSeqVariableTraverser.varsNoSeq( pat ); - HashMap freshenMap = new HashMap(); + Vector varsToExport = NoSeqVariableTraverser.varsNoSeq( pat ); + HashMap freshenMap = new HashMap(); + HashMap helpMap3 = new HashMap(); - HashMap helpMap3 = new HashMap(); + // "freshening": never use the same symbol more than once + // (in later invocations of _cur_match) - // "freshening": never use the same symbol more than once - // (in later invocations of _cur_match) + 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 )); + } - 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 )); - } + //System.out.println("RightTracerInScala::freshenMap :"+freshenMap); + //System.out.println("RightTracerInScala:: -pat :"+pat.toString()); + //System.out.println("RightTracerInScala::varsToExport :"+varsToExport); - //System.out.println("RightTracerInScala::freshenMap :"+freshenMap); - //System.out.println("RightTracerInScala:: -pat :"+pat.toString()); - //System.out.println("RightTracerInScala::varsToExport :"+varsToExport); + // "freshening" + /* TEST + */ + TreeCloner tc = new TreeCloner( cf.unit.global, freshenMap, Type.IdMap ); + pat = tc.transform( pat ); - // "freshening" - TreeCloner st = new TreeCloner(cf.unit.global, freshenMap, Type.IdMap ); - pat = st.transform( pat ); - //System.out.println("RightTracerInScala:: -pat( after subst ) :"+pat); + //System.out.println("RightTracerInScala:: -pat( after subst ) :"+pat); - // val match { case <pat> => { <do binding>; true } - // case _ => false + // val match { case <pat> => { <do binding>; true } + // case _ => false - am.construct( m, new CaseDef[] { - cf.gen.CaseDef( pat, // if tree val matches pat -> update vars, return true + am.construct( m, new CaseDef[] { + cf.gen.CaseDef( pat, // if tree val matches pat -> update vars, return true handleBody1( helpMap3 )/* "freshening */), - cf.gen.CaseDef( cf.gen.Ident( pat.pos, defs.PATTERN_WILDCARD ), - gen.mkBooleanLit( pat.pos, false )) }, // else return false - true // do binding please - ); + cf.gen.CaseDef( cf.gen.Ident( pat.pos, defs.PATTERN_WILDCARD ), + gen.mkBooleanLit( pat.pos, false )) }, // else return false + true // do binding please + ); - return am.toTree(); + return am.toTree(); } /** 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 ) { - HashMap hmap = (HashMap) dfa.deltaq( i ); - Integer ntarget = (Integer) hmap.get( label ); - Tree algMatchTree = null; - if( ntarget == null ) - return null; - - //System.out.println("delta("+i+","+label+")" ); - Label theLab = null; - switch(label) { - case Label.Pair( Integer state, Label lab2 ): - //assert ntarget == state; - theLab = lab2; - switch( lab2 ) { - case TreeLabel( Tree pat ): - algMatchTree = _cur_match( pat ); - break; - } - break; - case DefaultLabel: - throw new ApplicationError(); // should not happen - } - assert dfa.qbinders != null : "qbinders ?"; - - Vector vars = dfa.qbinders[ i ]; - - if( vars == null ) vars = new Vector(); // TODO: make this more consistent - assert vars != null; - - //System.out.println("delta: theLab: " + theLab + " vars in current ="+ vars ); - - if( ntarget == null ) - return code_fail(); - - Tree stms[] = new Tree[ vars.size() - + ((algMatchTree != null )? 1 : 0 ) - + 1 ]; - int j = 0; - for( Iterator it = vars.iterator(); it.hasNext(); ) { - Symbol var = (Symbol) it.next(); - - Tree rhs = gen.Ident( pos, curSym ); - - stms[ j++ ] = prependToHelpVar( var , rhs); - } - - if( algMatchTree != null ) - stms[ j++ ] = algMatchTree ; - - stms[ j ] = callFun( new Tree[] { cf.SeqTrace_tail( _iter() ), - gen.mkIntLit( cf.pos, ntarget ) } ); - - return gen.mkBlock( pos, stms ); + HashMap hmap = (HashMap) dfa.deltaq( i ); + Integer ntarget = (Integer) hmap.get( label ); + Tree algMatchTree = null; + if( ntarget == null ) + return null; + + //System.out.println("delta("+i+","+label+")" ); + Label theLab = null; + switch(label) { + case Label.Pair( Integer state, Label lab2 ): + //assert ntarget == state; + theLab = lab2; + switch( lab2 ) { + case TreeLabel( Tree pat ): + algMatchTree = _cur_match( pat ); + break; + } + break; + case DefaultLabel: + throw new ApplicationError(); // should not happen + } + assert dfa.qbinders != null : "qbinders ?"; + + Vector vars = dfa.qbinders[ i ]; + + if( vars == null ) vars = new Vector(); // TODO: make this more consistent + assert vars != null; + + //System.out.println("delta: theLab: " + theLab + " vars in current ="+ vars ); + + Tree stms[] = new Tree[ vars.size() + + ((algMatchTree != null )? 1 : 0 ) + + 1 ]; + int j = 0; + for( Iterator it = vars.iterator(); it.hasNext(); ) { + Symbol var = (Symbol) it.next(); + + Tree rhs = gen.Ident( pos, curSym ); + + stms[ j++ ] = prependToHelpVar( var , rhs); + } + + if( algMatchTree != null ) + stms[ j++ ] = algMatchTree ; + + stms[ j ] = callFun( new Tree[] { cf.SeqTrace_tail( _iter() ), + gen.mkIntLit( cf.pos, ntarget ) } ); + + return gen.mkBlock( pos, stms ); } Tree stateWrap(int i) { @@ -517,15 +504,9 @@ public class RightTracerInScala extends TracerInScala { * todo: move tree generation of Unit somewhere else */ Tree run_finished( int state ) { - return gen.Block(Position.FIRSTPOS, Tree.EMPTY_ARRAY); + return gen.Block(Position.FIRSTPOS, Tree.EMPTY_ARRAY); } - Tree current() { - return gen.Ident( pos, targetSym ); - } - - Tree currentElem() { - return gen.Ident( pos, curSym ); - } + Tree current() { return gen.Ident( pos, targetSym );} } diff --git a/sources/scalac/transformer/matching/TracerInScala.java b/sources/scalac/transformer/matching/TracerInScala.java index d3315bf5df..280aa4edd7 100644 --- a/sources/scalac/transformer/matching/TracerInScala.java +++ b/sources/scalac/transformer/matching/TracerInScala.java @@ -20,47 +20,49 @@ public class TracerInScala extends Autom2Scala { protected boolean optimize = true; + /* LeftTracer puts into this HashMap all variables it encounters + */ HashMap helpMap; - public TracerInScala( DetWordAutom dfa, - Type elementType, - Symbol ownerSym, - CodeFactory cf ) { - super( dfa, elementType, ownerSym, cf ); - - this.helpMap = new HashMap(); - - } - - Tree refHelpVar( Symbol realVar ) { - Symbol hv = (Symbol)helpMap.get( realVar ); - assert hv != null : realVar; - return gen.Ident(Position.FIRSTPOS, hv); - } - - Tree assignToHelpVar( Symbol realVar, Tree rhs ) { - Tree hv = refHelpVar( realVar ); - return gen.Assign( hv, rhs ); - } - - Tree bindVar(Symbol realVar) { - Tree hv = refHelpVar( realVar ); - /* - System.out.println("binding realVar.name "+realVar.name+" type:"+realVar.type()+" to hv type:"+hv.type()); - realVar.setOwner( owner ); - System.out.println("is same as realVar"+realVar.type().isSameAs( elementType )); - System.out.println("is same as hv"+realVar.type().isSameAs( hv.type() )); - if( realVar.type().isSameAs( elementType )) - return gen.ValDef( realVar, cf.SeqList_head( hv )); - else - return gen.ValDef( realVar, hv ); - */ - if( realVar.type().isSameAs( hv.getType())) { - return gen.ValDef( realVar, hv ); // e.g. x @ _* - } - return gen.ValDef( realVar, cf.SeqList_head( hv )); - - } + public TracerInScala( DetWordAutom dfa, + Type elementType, + Symbol ownerSym, + CodeFactory cf ) { + super( dfa, elementType, ownerSym, cf ); + + this.helpMap = new HashMap(); + + } + + Tree refHelpVar( Symbol realVar ) { + Symbol hv = (Symbol)helpMap.get( realVar ); + assert hv != null : realVar; + return gen.Ident(Position.FIRSTPOS, hv); + } + + Tree assignToHelpVar( Symbol realVar, Tree rhs ) { + Tree hv = refHelpVar( realVar ); + return gen.Assign( hv, rhs ); + } + + Tree bindVar(Symbol realVar) { + Tree hv = refHelpVar( realVar ); + /* + System.out.println("binding realVar.name "+realVar.name+" type:"+realVar.type()+" to hv type:"+hv.type()); + realVar.setOwner( owner ); + System.out.println("is same as realVar"+realVar.type().isSameAs( elementType )); + System.out.println("is same as hv"+realVar.type().isSameAs( hv.type() )); + if( realVar.type().isSameAs( elementType )) + return gen.ValDef( realVar, cf.SeqList_head( hv )); + else + return gen.ValDef( realVar, hv ); + */ + if( realVar.type().isSameAs( hv.getType())) { + return gen.ValDef( realVar, hv ); // e.g. x @ _* + } + return gen.ValDef( realVar, cf.SeqList_head( hv )); + + } } diff --git a/sources/scalac/transformer/matching/WordAutomInScala.java b/sources/scalac/transformer/matching/WordAutomInScala.java index e048cb205d..1a3ad458df 100644 --- a/sources/scalac/transformer/matching/WordAutomInScala.java +++ b/sources/scalac/transformer/matching/WordAutomInScala.java @@ -22,22 +22,24 @@ import Tree.*; import java.util.*; -/** +/** translates a recognizer to scala code */ public class WordAutomInScala extends Autom2Scala { + Tree theDefDef ; + Tree getMatcherSwitch(Tree selector, Tree failTree, Tree body[], Type resultType) { Tree run = callFun( new Tree[] { - cf.newIterator(selector), - gen.mkIntLit(Position.FIRSTPOS, 0) } ); + cf.newIterator(selector), + gen.mkIntLit(Position.FIRSTPOS, 0) } ); /* return code `var <swres>: scala.Int = <init>' */ - run = _intvar(resultSym, run); + run = gen.ValDef( resultSym, run ); Tree result; @@ -73,7 +75,7 @@ public class WordAutomInScala extends Autom2Scala { if (target == null) switch (label) { case DefaultLabel: - return code_fail(); // this may not happen ! + return code_error(); // this may not happen ! default: return null; // not good } @@ -81,23 +83,25 @@ public class WordAutomInScala extends Autom2Scala { return code_fail(); return callFun(new Tree[] { _iter(), - gen.mkIntLit(Position.FIRSTPOS, target.intValue())} ); + gen.mkIntLit(Position.FIRSTPOS, target.intValue())} ); } - /** ... - * @param dfa ... - * @param elementType ... - * @param owner ... - * @param cf ... - * @return ... + /** constructor + * @param dfa the dfa that is to be translated + * @param elementType type of the objects in the sequence + * @param owner the owner of the pattern match + * @param cf code factory + * @param optim flag that indicates whether to optimize + * @return an object that translates the dfa */ - public WordAutomInScala(DetWordAutom dfa, + public WordAutomInScala(int pos, + DetWordAutom dfa, Type elementType, Symbol owner, CodeFactory cf, - boolean optim) { + boolean optim) { super(dfa, elementType, owner, cf); - + this.pos = pos; this.optimize &= optim; } |