import java.util.*; import Jakarta.util.FixDosOutputStream; import java.io.*; // signature of data members "<var name>" -- doesn't involve type /** production AST_VarDecl <br> : VariableDeclarator ( "," VariableDeclarator )* <br> ; <br> * * @layer<preprocess> */ public class AST_VarDecl { /** add variables of base to hash table * @layer<preprocess> */ public void add2Hash( Hashtable h ) { AstCursor c = new AstCursor(); for ( c.FirstElement( this ); c.MoreElement(); c.NextElement() ) { String s = ( ( VariableDeclarator ) c.node ).GetName(); h.put( s , c.node ); } } /** invoked only on extension nodes -- check if extension wants to add fields already present in base. If so, it's an error * @layer<preprocess> */ public boolean actOnHash( Hashtable h ) { // method called only on nodes of extension tree AstCursor c = new AstCursor(); for ( c.FirstElement( this ); c.MoreElement(); c.NextElement() ) { String s = ( ( VariableDeclarator ) c.node ).GetName(); VariableDeclarator v = ( VariableDeclarator ) h.get( s ); // if v == null, then the extension is defining a new variable // otherwise, v is being overridden. We don't allow variables // to be overridden if ( v != null ) if ( v instanceof VarDecl ) AstNode.error( arg[0].arg[0].tok[0], "cannot refine data member" + s ); else AstNode.error( "cannot refine data member" + s ); } // always return false -- we don't want variables to // be deleted return false; } }