// This code initializes the symbol table by traversing // declarations. Main { traversal initSymbolTable (InitSymbolTableVisitor) { through Declaration bypassing Expr to *; } } InitSymbolTableVisitor { {{ // the traversal builds a string for input to Symbol.parse() String str; String name; }} before Varname {{ str = host.get_v().toString(); name = str; }} before Asset {{ str = str + " asset"; }} before Liability {{ str = str + " liability"; }} after Declaration {{ // first check if symbol is in table if (Main.symbolTable.findSymbol(name) != null) { System.out.println ("Warning: Ignoring redeclaration of variable " + name); return; } Expr expr = host.get_expr(); if (expr != null) { str = str + " " + expr.evaluate(); } Symbol symbol = Symbol.parse(str); Main.symbolTable.get_symbol_list().addElement(symbol); }} } // a shortcut for getting the Varname string Varname { public String toString() {{ return get_v().toString(); }} }