import java.util.*; import Jakarta.util.*; public class variable { public static variable current; // most recently parsed variable public static HashMap Vtable; // current set of variables public static final int T=1; // true public static final int F=0; // false public static final int U=-1; // unknown public static int vtsize = 0; // size of Vtable public static final int Unkn=0; // unknown public static final int Sprd=1; // starting production public static final int Prod=2; // production public static final int Patt=3; // pattern public static final int Prim=4; // primitive public String getType() { if (type==Unkn) return "Unkn"; if (type==Sprd) return "Sprd"; if (type==Prod) return "Prod"; if (type==Patt) return "Patt"; if (type==Prim) return "Prim"; Util.fatalError("unknown type for " + name + " is " + type); return null; } public int value; public String name; public int type; public gObj gobj; public boolean redefine; // can this be redefined? public static variable define( String name, int type, gObj g, boolean redefinable ) { if ( vtsize==0 ) Vtable = new HashMap(); variable v = ( variable ) Vtable.get( name ); if (v != null) { if (v.redefine) { v.redefine = false; return v; } Util.error( "multiple definitions of "+ name ); return v; } v = new variable(); current = v; v.name = name; v.value = U; v.type = type; v.gobj = g; v.redefine = redefinable; Vtable.put( name, v ); vtsize++; return v; } public void setValue( int v ) { value = v; } public void print() { System.out.print( " "+value+" = "+name+ " type=" + getType() + " " ); if ( gobj == null ) System.out.print( " gobj not set " ); else if ( !name.equals( gobj.name ) ) Util.error( "variable name != definition name" ); } public void visit( GVisitor v ) { v.action( this ); } public static void dumpVtable() { variable v; int cnt = 0; System.out.println( "-------Begin Vtable Dump----------" ); Iterator i = Vtable.values().iterator(); while ( i.hasNext() ) { v = ( variable ) i.next(); v.print(); System.out.println(); cnt++; } System.out.println( cnt + " variables in all." ); System.out.println( "-------End Vtable Dump----------" ); } public void setgobj( gObj g ) { gobj = g; } }