From 1e59ef7fe08de15dd7a87d7b39f88d750c401c03 Mon Sep 17 00:00:00 2001 From: buraq Date: Thu, 3 Jun 2004 20:05:08 +0000 Subject: *** empty log message *** --- sources/scala/tools/dtd2scala/DeclToScala.scala | 23 +++++++++++------- .../dtd2scala/template/ObjectTemplate.scala.xml | 25 ++++++++++++------- sources/scala/tools/scalac/ast/TreeList.scala | 14 +++++------ .../scalac/ast/parser/PatternNormalizer.scala | 24 +++++++++++++++++-- .../scalac/transformer/matching/Autom2Scala.java | 6 ++--- .../scalac/transformer/matching/BerrySethi.java | 28 ++++++++++++++++++---- .../transformer/matching/BindingBerrySethi.java | 5 ++++ sources/scalac/transformer/matching/Label.java | 8 +++---- .../transformer/matching/SequenceMatcher.java | 4 ++-- .../transformer/matching/TestRegTraverser.java | 6 +++-- .../transformer/matching/WordAutomInScala.java | 7 +++--- 11 files changed, 104 insertions(+), 46 deletions(-) (limited to 'sources') diff --git a/sources/scala/tools/dtd2scala/DeclToScala.scala b/sources/scala/tools/dtd2scala/DeclToScala.scala index 39f3ccdc7f..2dfb924310 100644 --- a/sources/scala/tools/dtd2scala/DeclToScala.scala +++ b/sources/scala/tools/dtd2scala/DeclToScala.scala @@ -76,7 +76,7 @@ class DeclToScala(fOut:PrintWriter, } val sb = new StringBuffer(); for( val key <- curAttribs.keys ) { - sb.append(" case Seq("); + sb.append(" case Seq((),"); curAttribs( key ) match { case AttrDecl( key, tpe, df ) => appendKey( key, sb ); @@ -118,7 +118,7 @@ class DeclToScala(fOut:PrintWriter, /*Console.println("sCM:"+ r.getClass() + " r:"+r );*/ r match { case Eps => "" - case RNode(name) => "$TagOf" + cookedCap( name ); + case RNode(name) => refTag( name ).toString(); case Star(r) => "("+shallowContentModel( r ) +") *" case Alt( rs @ _* ) => shallowContentModel1( rs, '|' ) case Sequ( rs @ _* ) => shallowContentModel1( rs, ',' ) @@ -136,28 +136,31 @@ class DeclToScala(fOut:PrintWriter, case Star(Alt(PCDATA_, alts @ _*)) => { val sb = new StringBuffer("tagIterator( ch ).forall( x:Int => x match {"); for( val alt <- alts.elements ) { - sb.append(" case $TagOf"); - alt match { case RNode( name ) => sb.append( cookedCap( name ));} + sb.append(" case "); + alt match { case RNode( name ) => sb.append( refTag( name ).toString() )} sb.append(" => true \n"); } sb.append("case _ => false })"); sb.toString(); } case _ => val sb = new StringBuffer("tagIterator( ch ).toList.match {"); - sb.append(" case Seq( "); + sb.append(" case Seq("); sb.append( shallowContentModel( r ) ); sb.append( ") => true \n"); - sb.append( "case _ => false }\n"); + sb.append( "case _ => Console.println( tagIterator( ch ).toList);false }\n"); sb.toString(); } } var tagCounter = 0; - def newTag = { + val refTag = new HashMap[String,Int](); + def newTag(elemName:String) = { val i = tagCounter; tagCounter = tagCounter + 1; + refTag.update( elemName, i ); i } + def write:Unit = { def writeNode( x:Node ):Unit = { //Console.println("visiting "+x); @@ -177,8 +180,10 @@ class DeclToScala(fOut:PrintWriter, fOut.print( validateAttributes( curAttribs ) ); case "shallowContentRegExp" => fOut.print( shallowValidate( curModel ) ); - case "elementTag" => - fOut.print( newTag.toString() ); + case "makeTag" => + fOut.print( newTag( lookup("elementName") ).toString() ); + case "refTag" => + fOut.print( refTag( lookup("elementName") ).toString() ); case "elementBinding" => { for( val decl <- elemMap.values ) { lookup += "elementName" -> decl.name; diff --git a/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml b/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml index dce193c3aa..63d1abf12f 100644 --- a/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml +++ b/sources/scala/tools/dtd2scala/template/ObjectTemplate.scala.xml @@ -42,6 +42,12 @@ +(map.keys.filter { x => map(x) == "<R" }) .toList.mkString("",",","")); + + def error_InvalidChildren( elName:String, ch:cT, cM:String ) = + error("trying to construct invalid "+elName+",\n children labels were: " + +ch.elements.map( x => x.label ).toList.mkString("",",","") + +"\n content model was "+cM); + abstract class Node$ extends scala.xml.Node; def tagIterator(ch:Seq[scala.xml.Node]):Iterator[Int] = new Iterator[Int] { @@ -55,9 +61,10 @@ val n = it.next; val i = n.typeTag$; if( i > 0 ) i else $tagMap.get( n.label ) match { - case Some( j ) => j - case None => 0 - } + case Some( j ) => j + case _ => 0 + } + } else { error("internal error"); } @@ -65,14 +72,16 @@ } private val $tagMap = new mutable.HashMap[String,Int]; - val $TagOf&ccElementName;:int = ; - $tagMap.update( &qElementName;, $TagOf&ccElementName; ); + $tagMap.update( &qElementName;, ); + + + def constr_&ccElementName;( attrs:aT, ch:cT ) = &ccElementName;(attrs,ch:_*); case class &ccElementName;( attrs:Map[String,String], ch:scala.xml.Node* ) extends Node$ { - final override def typeTag$ = $TagOf&ccElementName;; + final override def typeTag$ = ; final def shallowValidate&ccElementName;Children( ch:Seq[scala.xml.Node] ) = ; @@ -94,7 +103,7 @@ } if( !shallowValidate&ccElementName;Children( ch ) ) - error("trying to construct invalid &elementName;"); + error_InvalidChildren( &qElementName;, ch, ); final def label = &qElementName;; final def child = ch; @@ -104,7 +113,7 @@ hmap = validateAttributes( attrs ); } catch { case e:java.lang.Error => - error("trying to construct invalid &elementName;\n"+e.getMessage()); + error("invalid attributes for &elementName;\n"+e.getMessage()); } final def attribute:aT = hmap; diff --git a/sources/scala/tools/scalac/ast/TreeList.scala b/sources/scala/tools/scalac/ast/TreeList.scala index a51e532c4a..5dc3dda7a5 100644 --- a/sources/scala/tools/scalac/ast/TreeList.scala +++ b/sources/scala/tools/scalac/ast/TreeList.scala @@ -32,13 +32,13 @@ final class TreeList(ts: Array[Tree]) { this } - def append(ts: Array[Tree]): unit = { - for (val j <- Iterator.range(0, ts.length)) - append(ts(j)); + def append(tts: Array[Tree]): unit = { + for (val j <- Iterator.range(0, tts.length)) + append(tts(j)); } def append(tl: TreeList): unit = { - for (val j <- Iterator.range(0, tl.len)) // not ts.length !! + for (val j <- Iterator.range(0, tl.len)) append(tl.trees(j)); } @@ -59,9 +59,9 @@ final class TreeList(ts: Array[Tree]) { } def toArray(): Array[Tree] = { - val ts = new Array[Tree](len); - System.arraycopy(trees, 0, ts, 0, len); - ts + val tts = new Array[Tree](len); + System.arraycopy(trees, 0, tts, 0, len); + tts } def copyTo[t <: Tree](ts: Array[t]): Array[t] = copyTo(ts, 0); diff --git a/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala b/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala index ab068f8c35..f4dbf8de26 100644 --- a/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala +++ b/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala @@ -281,6 +281,7 @@ package scala.tools.scalac.ast.parser { /** (2) nested `Sequence' nodes are flattened (( clique elimination )) * nested empty subsequences get deleted + * for Apply nodes, sequence arguments are removed */ // apply `flattenSequence' to each tree in trees @@ -295,6 +296,25 @@ package scala.tools.scalac.ast.parser { // main algo for (2) def flattenSequence( tree:Tree ):Tree = { tree match { + case Tree$Apply( fn, trees:Array[Tree] ) => + var li:List[Tree] = Nil; + var i = 0; while( i < trees.length ) { + trees(i) match { + case Tree$Sequence( trees2:Array[Tree] ) => + Iterator.fromArray( flattenSequenceChildren( trees2 ).toArray() ).foreach { + x:Tree => li = x::li; + } + case z => li = z::li; + } + i = i + 1; + } + val newtrees:Array[Tree] = new Array[Tree]( li.length ); + i = 0; + for( val nt <- li.reverse.elements ) { + newtrees( i ) = nt; + i = i + 1; + } + make.Apply( tree.pos, fn, newtrees ) /* case Sequence( Tree[] trees ): trees = flattenSequences( trees ); @@ -321,8 +341,8 @@ package scala.tools.scalac.ast.parser { } System.out.println(); */ - val t = treeListToSequence( tree.pos, ts ) ; - t + val t = treeListToSequence( tree.pos, ts ) ; + t case Tree$Alternative( choices ) => make.Alternative( tree.pos, flattenSequences( choices )); case Tree$Bind( vble, body ) => diff --git a/sources/scalac/transformer/matching/Autom2Scala.java b/sources/scalac/transformer/matching/Autom2Scala.java index 22d20af9ee..a9c6af5cdb 100644 --- a/sources/scalac/transformer/matching/Autom2Scala.java +++ b/sources/scalac/transformer/matching/Autom2Scala.java @@ -142,13 +142,13 @@ public class Autom2Scala { tags[ i ] = i; bodies[ i ] = stateWrap( i ); } - if( optimize ) + //if( optimize ) return loadCurrentElem( gen.Switch( _state(), tags, bodies, code_error(), // cannot happen funRetType())); - + /* Tree res = code_error(); for( int i = dfa.nstates-2; i>= 0; i-- ) res = gen.If( cf.Equals( _state(), gen.mkIntLit( cf.pos, i )), @@ -156,7 +156,7 @@ public class Autom2Scala { res ); return loadCurrentElem( res ); - + */ } AlgebraicMatcher am; diff --git a/sources/scalac/transformer/matching/BerrySethi.java b/sources/scalac/transformer/matching/BerrySethi.java index 1de1a0f192..a97552702a 100644 --- a/sources/scalac/transformer/matching/BerrySethi.java +++ b/sources/scalac/transformer/matching/BerrySethi.java @@ -1,5 +1,6 @@ package scalac.transformer.matching ; +import scalac.Unit ; import scalac.ApplicationError ; import scalac.ast.Tree ; import scalac.ast.TreeInfo ; @@ -17,9 +18,17 @@ import java.util.* ; class BerrySethi { - boolean isStar( Name n ) { - return TreeInfo.isNameOfStarPattern( n ); - } + Unit unit; + + public BerrySethi(Unit unit) { + this.unit = unit; + } + + boolean isStar( Name n ) { + boolean res = TreeInfo.isNameOfStarPattern( n ); + //System.out.println("berry-sethi isStar?"+n.toString()+res); + return res; + } /* String s = n.toString(); @@ -355,8 +364,17 @@ class BerrySethi { void seenLabel( Tree pat, Integer i, Label label ) { this.posMap.put( pat, i ); this.labelAt.put( i, label ); - if( label != Label.DefaultLabel ) - this.labels.add( label ); + if( label != Label.DefaultLabel ) { + if( this.labels.contains( label ) ) { + switch(label) { + case TreeLabel(Apply(_, Tree[] args)): + if( args.length > 0 ) { + unit.error(pat.pos, "sorry, this version of scalac cannot handle this pattern correctly"); + } + } + } + this.labels.add( label ); + } } /** overriden in BindingBerrySethi diff --git a/sources/scalac/transformer/matching/BindingBerrySethi.java b/sources/scalac/transformer/matching/BindingBerrySethi.java index b2a8301516..e68bef1eaf 100644 --- a/sources/scalac/transformer/matching/BindingBerrySethi.java +++ b/sources/scalac/transformer/matching/BindingBerrySethi.java @@ -1,5 +1,6 @@ package scalac.transformer.matching ; +import scalac.Unit; import scalac.Global ; import scalac.ApplicationError ; import scalac.ast.Tree ; @@ -19,6 +20,10 @@ import java.util.* ; public class BindingBerrySethi extends BerrySethi { + public BindingBerrySethi(Unit unit) { + super(unit); + } + HashMap deltaqRev[]; // delta of Rev Vector defaultqRev[]; // default transitions of Rev Vector qbinders[]; // transitions <-> variables diff --git a/sources/scalac/transformer/matching/Label.java b/sources/scalac/transformer/matching/Label.java index d04991c5d3..f03321cb22 100644 --- a/sources/scalac/transformer/matching/Label.java +++ b/sources/scalac/transformer/matching/Label.java @@ -30,11 +30,9 @@ public class Label { case SimpleLabel( Literal lit ): return lit.value.hashCode(); case TreeLabel( Tree pat ): - switch( pat ) { - case Apply( Tree fun, Tree[] args ): - return pat.getType().hashCode() + args.hashCode(); - } - return pat.hashCode(); + // if pat is an Apply, than this case can only be correctly + // handled if it has no arguments...or there are no collisions + return pat.type().hashCode(); case TypeLabel( Type type ): return type.hashCode(); default: diff --git a/sources/scalac/transformer/matching/SequenceMatcher.java b/sources/scalac/transformer/matching/SequenceMatcher.java index 5b0ff01ef4..fb8dfd8027 100644 --- a/sources/scalac/transformer/matching/SequenceMatcher.java +++ b/sources/scalac/transformer/matching/SequenceMatcher.java @@ -37,7 +37,7 @@ public class SequenceMatcher extends PatternTool { */ Tree addBinderToBody( Tree pat, Tree body ) { if( bbuild == null ) - bbuild = new BindingBerrySethi(); + bbuild = new BindingBerrySethi(unit); Type elementType = cf.getElemType_Sequence( pat.getType() ); @@ -71,7 +71,7 @@ public class SequenceMatcher extends PatternTool { } private NondetWordAutom[] buildNfas( Tree[] pat ) { - BerrySethi build = new BerrySethi(); + BerrySethi build = new BerrySethi(unit); NondetWordAutom manyNfa[] = new NondetWordAutom[ pat.length ]; for( int i = 0; i < pat.length; i++ ) { diff --git a/sources/scalac/transformer/matching/TestRegTraverser.java b/sources/scalac/transformer/matching/TestRegTraverser.java index bd01786734..fec6b3c0b4 100644 --- a/sources/scalac/transformer/matching/TestRegTraverser.java +++ b/sources/scalac/transformer/matching/TestRegTraverser.java @@ -48,8 +48,10 @@ public class TestRegTraverser extends Traverser { break; case Sequence( Tree[] trees): - //result = true; - traverse( trees ); + if( trees.length == 0 ) { + result = true; + break; + } else traverse( trees ); //result = true; break; diff --git a/sources/scalac/transformer/matching/WordAutomInScala.java b/sources/scalac/transformer/matching/WordAutomInScala.java index 51a3e85c3a..a8b2413c9c 100644 --- a/sources/scalac/transformer/matching/WordAutomInScala.java +++ b/sources/scalac/transformer/matching/WordAutomInScala.java @@ -35,8 +35,9 @@ public class WordAutomInScala extends Autom2Scala { Tree result; + /* boolean insane = true; // if you set this to false, you get some VerifyErrors - + // seems fixed if( insane ) { // cascading ifs Tree cond[] = new Tree[body.length]; @@ -46,14 +47,14 @@ public class WordAutomInScala extends Autom2Scala { result = cf.Switch( cond, body, failTree ); } 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 )), -- cgit v1.2.3