import java.util.*; import Jakarta.util.*; class production { node formula; static void makeFormula() { Iterator i = Ptable.values().iterator(); while ( i.hasNext() ) { production p = ( production ) i.next(); p.formula = p.makef(); } } public node makef() { node n = null; node o = null; int cnt = 0; Iterator i = pat.iterator(); while ( i.hasNext() ) { pattern t = ( pattern ) i.next(); cnt++; switch ( type ) { case production.norm: /* choose 1 */ case production.opt: /* treat like choose 1 */ if ( o == null ) o = new bterm( t.name ); else o = new or( new bterm( t.name ), o ); if ( n == null ) n = new bterm( t.name ); else n = new atmostone( new bterm( t.name ), n ); break; case production.star: /* choose any number - treat like star */ case production.plus: if ( n == null ) n = new bterm( t.name ); else n = new or( new bterm( t.name ), n ); break; default: Util.error( "production " + name + " is not referenced in grammar" ); return new bterm( t.name ); // return some dummy } } switch ( type ) { case production.norm: case production.opt: if (cnt>1) { // production iff (or of options) AND atmostone( list of options) return new and( new iff( new bterm( name ), o ), n ); } else { // production (prodname iff onlyPattern) // the atmostone(x) is always true return new iff( new bterm( name ), o ); } case production.star: case production.plus: // production iff (predicate associated with patterns) return new iff( new bterm( name ), n ); default: Util.fatalError( "unrecognizable type: " + type + " for production " + name ); } // should never get here Util.fatalError( "should never get here" ); return null; } public void print() { original(); System.out.print( " formula = " + formula ); } }