import Jakarta.util.*;
public class propcons implements GVisitor {
public void action( grammar n ) {
common(n.rootProduction);
n.rootProduction.type= production.norm;
n.rootProduction.var.setValue( variable.T );
n.traverse(this);
}
public void action( optprim n ) { common(n); }
public void action( optprod n ) {
production p = n.findProduction(n.name);
common( n );
common( p );
n.prod.type = production.opt;
p.traverse(this);
}
public void action( pattern n ) {
common(n); n.traverse(this); }
public void action( plus n ) {
production p = n.findProduction(n.name);
common( n );
common( p );
n.prod.type = production.plus;
p.traverse(this);
}
public void action( prim n ) { common(n); }
public void action( prod n ) {
production p = n.findProduction(n.name);
common( n );
common( p );
n.prod.type = production.norm;
p.traverse(this);
}
public void action( star n ) {
production p = n.findProduction(n.name);
common( n );
common( p );
n.prod.type = production.star;
p.traverse(this);
}
public void action( production n ) { common(n); n.traverse(this); }
public void action( term n ) { }
public void action( variable n ) {
System.err.println( "prodcons.variable should not be called" );
}
public void common( gObj n ) {
// link variable reference to its definition
n.var = (variable) variable.Vtable.get(n.name);
if (n.var == null) {
Util.error(n.name + " used in pattern, but not defined as variable");
// n.var = variable.define(n.name, variable.Prod, n ); //should not define at this point
}
n.var.gobj = n;
}
}