// SymbolTable.java import java.util.*; // SymbolTableEntry is a class to represent the symbol table entries // for PL/0 programs. class SymbolTableEntry { private int category; private int constValue; private SymbolTable procEnv; private SyntaxTree procSyntaxTree; public SymbolTableEntry (int cat) { category = cat; } public SymbolTableEntry (int cat, int val) { category = cat; constValue = val; } public SymbolTableEntry (int cat, SymbolTable env, SyntaxTree syntaxTree) { category = cat; procEnv = env; procSyntaxTree = syntaxTree; } public int category () { return category; } public int value () { return constValue; } public SymbolTable procEnv () { return procEnv; } public SyntaxTree procSyntaxTree () { return procSyntaxTree; } public String toString () { String printString = Category . toString (category); if (category == Category . CONSTANT) printString = printString + "(" + constValue + ")"; return printString; } } // SymbolTable is a class to represent the symbol table for PL/0 programs. public class SymbolTable { private static int maxlen = 2; // for header "Id" public static int maxLen () { return maxlen; } private TreeMap table; // id table public SymbolTable () { table = new TreeMap (); } // The enter function enters an id and its information into the symbol // table. public void enter (String id, SymbolTableEntry entry) { table . put (id, entry); if (id . length () > maxlen) maxlen = id . length (); } // The enterConst function enters a constant id and its value into the // symbol table. public void enterConst (String id, int value) { enter (id, new SymbolTableEntry (Category . CONSTANT, value)); } // The enterVar function enters a variable id into the symbol table. public void enterVar (String id) { enter (id, new SymbolTableEntry (Category . VARIABLE)); } // The enterProc function enters a procedure id, its local symbol table and // syntax tree into the symbol table. public void enterProc (String id, SymbolTable env, SyntaxTree syntaxTree) { enter (id, new SymbolTableEntry (Category . PROCEDURE, env, syntaxTree)); } // The entry function returns the symbol table entry for the id. public SymbolTableEntry entry (String id) { return (SymbolTableEntry) table . get (id); } // The print function prints the entire symbol table, including local // symbol tables and syntax trees for procedures. public void print (String blockName) { System . out . println (""); System . out . println ("Identifier Table for " + blockName); System . out . print ("---------------------"); for (int i = 0; i < blockName . length (); i++) System . out . print ("-"); System . out . println (""); System . out . println (""); System . out . print ("Id"); for (int i = 2; i < maxLen (); i++) System . out . print (" "); System . out . println (" Category"); System . out . print ("--"); for (int i = 2; i < maxLen (); i++) System . out . print (" "); System . out . println (" --------"); Iterator envIterator = table . entrySet () . iterator (); TreeMap procedureList = new TreeMap (); while (envIterator . hasNext ()) { Map . Entry entry = (Map . Entry) envIterator . next (); String id = (String) entry . getKey (); SymbolTableEntry idEntry = (SymbolTableEntry) entry . getValue (); System . out . print (id); for (int i = id . length (); i < maxLen (); i++) System . out . print (" "); System . out . print (" "); System . out . println (idEntry); if (idEntry . category () == Category . PROCEDURE) procedureList . put (id, idEntry); } Iterator procedureIterator = procedureList . entrySet () . iterator (); while (procedureIterator . hasNext ()) { Map . Entry entry = (Map . Entry) procedureIterator . next (); String procedureName = (String) entry . getKey (); SymbolTableEntry idEntry = (SymbolTableEntry) entry . getValue (); idEntry . procSyntaxTree () . print (procedureName); idEntry . procEnv () . print (procedureName); } } }