summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/matching
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2004-01-29 14:41:38 +0000
committerburaq <buraq@epfl.ch>2004-01-29 14:41:38 +0000
commit4f93a0fb9dd23e8dc3badf53562e67e042a98083 (patch)
treebe030be45b76c3a3cf1debe5d5221bb3c9d0679d /sources/scalac/transformer/matching
parent170091b6558ad26180176a826183d7694195b121 (diff)
downloadscala-4f93a0fb9dd23e8dc3badf53562e67e042a98083.tar.gz
scala-4f93a0fb9dd23e8dc3badf53562e67e042a98083.tar.bz2
scala-4f93a0fb9dd23e8dc3badf53562e67e042a98083.zip
using LabelDef instead of nested functions for ...
using LabelDef instead of nested functions for automata code generation
Diffstat (limited to 'sources/scalac/transformer/matching')
-rw-r--r--sources/scalac/transformer/matching/Autom2Scala.java64
-rw-r--r--sources/scalac/transformer/matching/LeftTracerInScala.java110
-rw-r--r--sources/scalac/transformer/matching/RightTracerInScala.java90
-rw-r--r--sources/scalac/transformer/matching/SequenceMatcher.java8
-rw-r--r--sources/scalac/transformer/matching/WordAutomInScala.java51
5 files changed, 142 insertions, 181 deletions
diff --git a/sources/scalac/transformer/matching/Autom2Scala.java b/sources/scalac/transformer/matching/Autom2Scala.java
index 21e25030cf..6f99a699cf 100644
--- a/sources/scalac/transformer/matching/Autom2Scala.java
+++ b/sources/scalac/transformer/matching/Autom2Scala.java
@@ -35,7 +35,7 @@ public class Autom2Scala {
/** owner of the pattern matching expression */
protected Symbol owner;
- /** symbol of the matcher fun */
+ /** symbol of the matcher DefDef or Label */
Symbol funSym;
/** symbol of the iterator ( scala.SequenceIterator ) */
@@ -57,22 +57,6 @@ public class Autom2Scala {
public int pos;
- String funSymName;
-
- Symbol newFunSym( String prefix ) {
- return new TermSymbol( pos,
- cf.fresh.newName( prefix ),
- owner,
- Modifiers.FINAL );
- }
-
- Symbol newParam( String prefix ) {
- return new TermSymbol( pos,
- cf.fresh.newName( prefix ),
- funSym,
- Modifiers.PARAM );
- }
-
Type funRetType() {
switch( funSym.type() ) {
case MethodType( _, Type retType ):
@@ -86,49 +70,6 @@ public class Autom2Scala {
return gen.mkApply_V(gen.Ident(pos, funSym), args);
}
-
- /** init funSym, iterSym, stateSym, resultSym
- * a subclass overriding initializeSyms may change these
- * (esp. funSym)
- */
- protected void initializeSyms() {
- if( funSymName == null )
- funSymName = "matcher";
- // the function that does the matching
-
- this.funSym = newFunSym( funSymName );
-
- this.iterSym = newParam("iter")
- .setType( cf._seqIterType( elementType ) ) ;
-
- this.stateSym = newParam("q")
- .setType( defs.INT_TYPE() ) ;
-
- this.resultSym = new TermSymbol( pos,
- cf.fresh.newName("swRes"),
- owner,
- 0 )
- .setType( defs.INT_TYPE() ) ;
-
- this.funSym
- .setType( new Type.MethodType( new Symbol[] {
- iterSym, stateSym }, defs.INT_TYPE() ));
-
- this.curSym = new TermSymbol( pos,
- CURRENT_ELEM,
- funSym,
- 0)
- .setType( elementType );
-
- this.hasnSym = new TermSymbol( pos,
- HASNEXT,
- funSym,
- 0)
- .setType( defs.BOOLEAN_TYPE() );
-
- }
-
-
public Autom2Scala( DetWordAutom dfa,
Type elementType,
Symbol owner,
@@ -156,7 +97,8 @@ public class Autom2Scala {
body });
}
- Tree currentElem() { return gen.Ident( Position.FIRSTPOS, curSym ); }
+ /** bug ?? */
+ Tree currentElem() { return gen.Ident( cf.pos, curSym ).setType( curSym.type() ); }
Tree currentMatches( Label label ) {
switch( label ) {
diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java
index b8079db47c..6bdd4c95dd 100644
--- a/sources/scalac/transformer/matching/LeftTracerInScala.java
+++ b/sources/scalac/transformer/matching/LeftTracerInScala.java
@@ -38,26 +38,63 @@ public class LeftTracerInScala extends TracerInScala {
}
protected void initializeSyms() {
- funSymName = "leftTracer";
+ this.funSym = new TermSymbol( pos,
+ cf.fresh.newName( "left" ),
+ owner,
+ Modifiers.LABEL );
+
+ this.iterSym = new TermSymbol( pos,
+ cf.fresh.newName( "iter" ),
+ owner,
+ Modifiers.MUTABLE )
+ .setType( cf._seqIterType( elementType ) ) ;
+
+ this.stateSym = new TermSymbol( pos,
+ cf.fresh.newName( "q" ),
+ owner,
+ Modifiers.MUTABLE )
+ .setType( defs.INT_TYPE() ) ;
- super.initializeSyms();
this.accumType = _accumType( elementType );
this.accumTypeArg = accumType.typeArgs()[0];
- this.accumSym = newParam("accum") // accumulator
+ this.accumSym = new TermSymbol( pos, // accumulator
+ cf.fresh.newName( "acc" ),
+ owner,
+ Modifiers.MUTABLE )
.setType( accumType );
- this.funSym
- .setType( new Type.MethodType( new Symbol[] {
- accumSym, iterSym, stateSym},
- accumType));
+ //this.funSym
+ // .setType( new Type.MethodType( new Symbol[] {
+ // accumSym, iterSym, stateSym},
+ // accumType));
- // 2 do: rename switchresultsym to something else...
+ this.funSym
+ .setType( new Type.MethodType( new Symbol[] { // dummy symbol MethodType
+ new TermSymbol( pos,
+ cf.fresh.newName( "q" ), // q:int
+ funSym,
+ Modifiers.PARAM )
+ .setType( defs.INT_TYPE() ),
+ new TermSymbol( pos, // acc:List[T] accumulator
+ cf.fresh.newName( "acc" ),
+ funSym,
+ Modifiers.PARAM )
+ .setType( accumType )
+ },
+ accumType)); // result type = List[T]
this.resultSym = new TermSymbol(pos,
cf.fresh.newName("trace"),
owner,
0 )
.setType( accumType ) ;
+
+ this.curSym = new TermSymbol( pos, CURRENT_ELEM, owner, 0)
+ .setType( elementType );
+
+ this.hasnSym = new TermSymbol( pos, HASNEXT, owner, 0)
+ .setType( defs.BOOLEAN_TYPE() );
+
}
/* should throw an exception here really, e.g. MatchError
@@ -96,7 +133,8 @@ public class LeftTracerInScala extends TracerInScala {
hd,
gen.Ident( cf.pos, accumSym ));
- return callFun( new Tree[] { newAcc , _iter(), gen.mkIntLit( cf.pos, target )} );
+ //return callFun( new Tree[] { newAcc , _iter(), gen.mkIntLit( cf.pos, target )} );
+ return callFun( new Tree[] { gen.mkIntLit( cf.pos, target ), newAcc } );
}
@@ -157,50 +195,20 @@ public class LeftTracerInScala extends TracerInScala {
elseBody );
}
- Tree[] getTrace() {
+ Tree getTrace() {
initializeSyms();
- Tree tb = code_body();
- //Tree tb = code_body_NEW(); BUG! ONLY FIRST ELEMENT GETS BOUND ?!!?
- Tree theDefDef = gen.DefDef( this.funSym,
- tb );
-
- Vector v = new Vector();
-
- //
- // `def leftTracer(...) = ...' the function definition
- v.add( theDefDef );
-
- Tree emptyAcc = gen.mkNil( cf.pos ); //cf._seqTraceNil( elementType );
-
- // the valdef is needed, because passing emptyAcc as a parameter
- // results in a ClassCastException at runtime (?!)
-
- Symbol emptyAccSym = new TermSymbol( pos,
- cf.fresh.newName("acc"),
- owner,
- 0 )
- .setType( accumType ) ;
-
- // `val acc = SeqNil[ elementType ]' init accumulator
- v.add( gen.ValDef( emptyAccSym, emptyAcc) );
-
- Tree run = callFun( new Tree[] {
- gen.Ident( pos, emptyAccSym ),
- cf.newIterator( selector, selector.getType() ),
- gen.mkIntLit( cf.pos, 0 ) });
-
- run = gen.ValDef( resultSym, run );
-
- v.add( run );
-
- Tree res[] = new Tree[ v.size() ];
- int j = 0;
- for( Iterator it = v.iterator(); it.hasNext(); )
- res[ j++ ] = (Tree) it.next();
-
- return res;
+ return cf.gen.mkBlock( cf.pos, new Tree[] {
+ gen.ValDef( iterSym, cf.newIterator( selector, selector.getType() )),
+ gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0) ),
+ gen.ValDef( accumSym, gen.mkNil( cf.pos )),
+ gen.ValDef( resultSym,
+ gen.LabelDef( this.funSym,
+ new Ident[] {
+ gen.Ident( pos, stateSym ),
+ gen.Ident( pos, accumSym )
+ }, code_body() /* code_body_new ? */ ))});
}
// calling the AlgebraicMatcher here
@@ -209,7 +217,7 @@ public class LeftTracerInScala extends TracerInScala {
//System.out.println("calling algebraic matcher on type:"+pat.type);
- Matcher m = new Matcher( funSym,
+ Matcher m = new Matcher( owner,
currentElem(),
defs.BOOLEAN_TYPE() );
diff --git a/sources/scalac/transformer/matching/RightTracerInScala.java b/sources/scalac/transformer/matching/RightTracerInScala.java
index a28f4476e3..c0265370c1 100644
--- a/sources/scalac/transformer/matching/RightTracerInScala.java
+++ b/sources/scalac/transformer/matching/RightTracerInScala.java
@@ -90,21 +90,19 @@ public class RightTracerInScala extends TracerInScala {
.toString()+"RTIS" ),
owner,
0);
+ Tree rhs;
//System.out.println("RTiS making helpvar : "+realVar+" -> "+helpVar);
- if( keepType )
+ if( keepType ) {
helpVar.setType( realVar.type() );
- else
+ rhs = gen.mkDefaultValue( cf.pos, realVar.type() );
+ } else {
helpVar.setType( defs.LIST_TYPE(elementType) );
+ rhs = gen.mkNil( cf.pos );
+ }
helpMap.put( realVar, helpVar );
-
- Tree rhs;
- if( keepType )
- rhs = gen.mkDefaultValue( cf.pos, realVar.type() );
- else
- rhs = gen.mkNil( cf.pos );
helpVar.flags |= Modifiers.MUTABLE;
Tree varDef = gen.ValDef( helpVar, rhs );
//((ValDef) varDef).kind = Kinds.VAR;
@@ -126,34 +124,47 @@ public class RightTracerInScala extends TracerInScala {
protected void initializeSyms() {
- this.funSym = newFunSym( "binder" );
+ this.funSym = new TermSymbol( pos,
+ cf.fresh.newName( "right" ),
+ owner,
+ Modifiers.LABEL );
this.iterSym = new TermSymbol( pos,
cf.fresh.newName("iter"),
- funSym,
- Modifiers.PARAM )
+ owner,
+ Modifiers.MUTABLE )
.setType( cf.SeqTraceType( elementType ));
this.stateSym = new TermSymbol( pos,
cf.fresh.newName("q"),
- funSym,
- Modifiers.PARAM )
+ owner,
+ Modifiers.MUTABLE )
.setType( defs.INT_TYPE() ) ;
this.curSym = new TermSymbol( pos,
- cf.fresh.newName("currentElement"),
- funSym,
+ cf.fresh.newName("cur"),
+ owner,
0)
.setType( elementType ) ;
this.targetSym = new TermSymbol( pos,
- cf.fresh.newName("targetState"),
- funSym,
+ cf.fresh.newName("p"),
+ owner,
0)
.setType( defs.INT_TYPE() ) ;
- funSym.setType( new Type.MethodType( new Symbol[] {
- iterSym, stateSym }, defs.UNIT_TYPE() ));
+ funSym.setType( new Type.MethodType( new Symbol[] { // dummy symbol MethodType
+ new TermSymbol( pos,
+ cf.fresh.newName("iter"), // iter:List[Pair[int,T]]
+ funSym,
+ Modifiers.PARAM )
+ .setType( cf.SeqTraceType( elementType )) ,
+ new TermSymbol( pos,
+ cf.fresh.newName( "q" ), // q:int
+ funSym,
+ Modifiers.PARAM )
+ .setType( defs.INT_TYPE() ) },
+ defs.UNIT_TYPE() )); // result
}
@@ -203,7 +214,6 @@ public class RightTracerInScala extends TracerInScala {
tmapBody.put( I, callFun( new Tree[] {
cf.SeqTrace_tail( _iter() ),
gen.mkIntLit( cf.pos, targetR ) }));
-
}
i = 0;
int[] tags = new int[ n ];
@@ -267,8 +277,7 @@ public class RightTracerInScala extends TracerInScala {
targets[ j ] = (Tree) tmapBody.get( J );
}
if( n > 0 ) {
- actionsPresent = true;
- return gen.Switch( gen.Ident( pos, targetSym ), tags, targets, code_error()/*cannot happen*/ );
+ return gen.Switch( gen.Ident( pos, targetSym ), tags, targets, code_error() );
} else
return code_error();
}
@@ -285,7 +294,7 @@ public class RightTracerInScala extends TracerInScala {
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 ) ) ;
+ //hv.setType( defs.LIST_TYPE( elementType ) ) ; DEBUG ALARM ?
Tree refv = gen.Ident(cf.pos, vsym);
Tree refhv = gen.Ident(cf.pos, hv);
res[ j++ ] = gen.Assign( refhv, refv );
@@ -301,7 +310,8 @@ public class RightTracerInScala extends TracerInScala {
//System.out.println("RTiS._cur_match("+pat.toString()+")");
//System.out.println("calling algebraic matcher on type:"+pat.type);
- Matcher m = new Matcher( funSym,//this.funSym,
+ //System.err.println( "curT"+currentElem().type().widen() );
+ Matcher m = new Matcher( owner,//funSym,//this.funSym,
currentElem(),
defs.BOOLEAN_TYPE() );
@@ -432,28 +442,26 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
return code_state_NEW( i );
}
- boolean actionsPresent = false;
-
/* returns statements that do the work of the right-transducer
*/
Tree[] getStms( Tree trace, Unit unit, Tree body ) {
Vector v = new Vector();
-
- Tree binderFunDef = gen.DefDef( this.funSym, code_body_NEW() );
- if( actionsPresent ) {
- //System.out.println( "!!getStms.helpVarDefs: "+helpVarDefs);
- v.addAll( helpVarDefs );
-
- v.add( binderFunDef );
- v.add( callFun( new Tree[] { trace, gen.mkIntLit( cf.pos, 0 ) } ) );
-
- // bind variables handled by this righttracer
- for( Iterator it = seqVars.iterator(); it.hasNext(); ) {
- v.add( bindVar( (Symbol) it.next() ) );
- }
-
- };
+ Tree loopbody = code_body_NEW();
+
+ v.add( gen.ValDef( iterSym, trace ) );
+ v.add( gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0 ) ) );
+ v.addAll( helpVarDefs );
+ v.add( gen.LabelDef( this.funSym,
+ new Ident[] {
+ gen.Ident( pos, iterSym ),
+ gen.Ident( pos, stateSym )
+ }, loopbody ));
+
+ // bind variables handled by this righttracer
+ for( Iterator it = seqVars.iterator(); it.hasNext(); ) {
+ v.add( bindVar( (Symbol) it.next() ) );
+ }
Transformer treeCloner = new Transformer(unit.global) {
public Tree transform(Tree tree) {
diff --git a/sources/scalac/transformer/matching/SequenceMatcher.java b/sources/scalac/transformer/matching/SequenceMatcher.java
index 97b23c9646..0b3cfdc4b1 100644
--- a/sources/scalac/transformer/matching/SequenceMatcher.java
+++ b/sources/scalac/transformer/matching/SequenceMatcher.java
@@ -53,7 +53,7 @@ public class SequenceMatcher extends PatternTool {
LeftTracerInScala ltis =
new LeftTracerInScala( dLeft, elementType, _m.owner, _m.selector, cf);
- Tree stms[] = ltis.getTrace();
+ Tree trace = ltis.getTrace();
Tree theTrace = gen.Ident( cf.pos, ltis.resultSym );
@@ -70,10 +70,10 @@ public class SequenceMatcher extends PatternTool {
// paste statements together
- Tree items[] = new Tree[ stms.length + stms2.length ];
+ Tree items[] = new Tree[ 1 + stms2.length ];
- System.arraycopy( stms, 0, items, 0, stms.length );
- System.arraycopy( stms2, 0, items, stms.length, stms2.length );
+ items[ 0 ] = trace;
+ System.arraycopy( stms2, 0, items, 1, stms2.length );
return gen.mkBlock( body.pos, items );
}
diff --git a/sources/scalac/transformer/matching/WordAutomInScala.java b/sources/scalac/transformer/matching/WordAutomInScala.java
index 149ab62e8e..bb05f6f63b 100644
--- a/sources/scalac/transformer/matching/WordAutomInScala.java
+++ b/sources/scalac/transformer/matching/WordAutomInScala.java
@@ -37,37 +37,41 @@ public class WordAutomInScala extends Autom2Scala {
Tree result;
- // conditions
- //int tags[] = new int[body.length];
- Tree cond[] = new Tree[body.length];
- //Tree bbody[] = new Tree[body.length];
- for( int i = body.length - 1; i >= 0; i-- ) {
- //tags[i] = i;
- cond[i] = cf.Equals(_swres(), gen.mkIntLit( cf.pos, i ));
- }
- result = cf.Switch( cond, body, failTree );
+ boolean insane = true; // if you set this to false, you get some VerifyErrors
+
+ if( insane ) { // cascading ifs
- //result = gen.Switch( _swres(), tags, body, failTree );
+ Tree cond[] = new Tree[body.length];
+ for( int i = body.length - 1; i >= 0; i-- ) {
+ cond[i] = cf.Equals(_swres(), gen.mkIntLit( cf.pos, i ));
+ }
+ result = cf.Switch( cond, body, failTree );
- result = cf.gen.mkBlock( cf.pos, new Tree[] { gen.ValDef( iterSym, cf.newIterator( selector )), // test
- gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0) ), // test
- //theDefDef,
- gen.ValDef( resultSym, theDefDef ),
- //run,
- result } );
+ } else { // real switch
+
+ int tags[] = new int[body.length];
+ for( int i = body.length - 1; i >= 0; i-- ) {
+ tags[i] = i;
+ }
+ result = gen.Switch( _swres(), tags, body, failTree );
+
+ }
+
+ result = cf.gen.mkBlock( cf.pos, new Tree[] {
+ gen.ValDef( iterSym, cf.newIterator( selector )),
+ gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0) ),
+ gen.ValDef( resultSym, theDefDef ),
+ result } );
//unit.global.debugPrinter.print( result );
return result;
}
protected void initializeSyms() { // TEST
- if( funSymName == null )
- funSymName = "matcher";
- // the function that does the matching
this.funSym = new TermSymbol( pos,
- cf.fresh.newName( "matcher" ),
- owner,
- Modifiers.LABEL );
+ cf.fresh.newName( "matcher" ),
+ owner,
+ Modifiers.LABEL );
this.iterSym = new TermSymbol( pos,
cf.fresh.newName("iter"),
@@ -162,8 +166,7 @@ public class WordAutomInScala extends Autom2Scala {
else if (target.intValue() == dfa.nstates - 1) // that one is a dead state
return code_fail();
- return callFun(new Tree[] { /*_iter(),*/
- gen.mkIntLit( cf.pos, target.intValue() )} );
+ return callFun(new Tree[] { gen.mkIntLit( cf.pos, target.intValue() )} );
}
/** constructor