summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2004-01-07 14:29:12 +0000
committerburaq <buraq@epfl.ch>2004-01-07 14:29:12 +0000
commita1c71f91578a3a25212b856379549d5d5107328e (patch)
tree546e689dd196c3eba7b80152287b2fef9b572fc4 /sources
parent71cd266cd4db5956ed2e74e7a600518ed6a4638b (diff)
downloadscala-a1c71f91578a3a25212b856379549d5d5107328e.tar.gz
scala-a1c71f91578a3a25212b856379549d5d5107328e.tar.bz2
scala-a1c71f91578a3a25212b856379549d5d5107328e.zip
cleanup
Diffstat (limited to 'sources')
-rw-r--r--sources/scalac/transformer/matching/LeftTracerInScala.java74
-rw-r--r--sources/scalac/transformer/matching/RightTracerInScala.java551
-rw-r--r--sources/scalac/transformer/matching/TracerInScala.java80
-rw-r--r--sources/scalac/transformer/matching/WordAutomInScala.java34
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;
}