import java.util.*;
import Jakarta.util.*;
public class production extends gObj {
public static final int unk = -1;
public static final int opt = 1;
public static final int plus = 2;
public static final int star = 3;
public static final int norm = 0;
static int counter = 0;
static production current;
public int type; // must be { opt, plus, star, norm }
public ArrayList pat;
static public HashMap Ptable;
production( String name ) {
super( name );
// Step 1: if this is the first production, then
// define a grammar object
if ( counter==0 ) {
new grammar( name );
grammar.rootProduction = (production) this;
Ptable = new HashMap();
}
counter++;
// Step 2: now define the production itself
current = (production) this;
this.type = unk; // unknown type at present
grammar.productions.put( name,(production)this );
pat = new ArrayList();
Ptable.put( name, (production) this );
}
String getType() {
if ( type == opt )
return "optional";
if ( type == plus )
return "plus";
if ( type == star )
return "star";
if ( type == norm )
return "choose1";
return "unknown";
}
public void visit( GVisitor v ) {
v.action( (production) this );
}
public void traverse( GVisitor v ) {
pattern p = null;
Iterator i = pat.iterator();
while ( i.hasNext() ) {
Object o = i.next();
try {
p = ( pattern ) o;
} catch( Exception e ) { Util.fatalError( e.getMessage() + " " +
o.getClass().getName());
}
p.visit( v );
}
}
public static void dumpPtable() {
production p;
int cnt = 0;
System.out.println( "-------Begin Ptable Dump----------" );
Iterator i = Ptable.values().iterator();
while ( i.hasNext() ) {
p = ( production ) i.next();
p.print();
System.out.println();
cnt++;
}
System.out.println( cnt + " productions in all." );
System.out.println( "-------End Ptable Dump----------" );
}
public void print() {
String v = "null";
if (var!=null) v = var.name;
System.out.print(name + " var is " + v + " " + getType());
}
static public production find( String name ) {
return ( production ) production.Ptable.get( name );
}
}