// Helper for HW2/CS453. import java.io.*; import visitor.*; import syntaxtree.*; import java.util.*; // Files are stored in the minijava directory/package. import minijava.*; public class Typecheck { public static void main(String[] args) { Node root = null; try { root = new MiniJavaParser(System.in).Goal(); // Pretty-print the tree. PPrinter inherits from // GJDepthFirst. R=Void, A=String. PPrinter pp = new PPrinter(); root.accept(pp, ""); // // Build the symbol table. Top-down visitor, inherits from // // GJDepthFirst. R=Void, A=Integer. // SymTableVis pv = // new SymTableVis(); // root.accept(pv, 0); // HashMap symt = pv.symt; // Do type checking. Bottom-up visitor, also inherits from // GJDepthFirst. Visit functions return MyTpe (=R), and // take a symbol table (HashMap) as // argument (=A). You may implement things differently of // course! TypeCheckSimp ts = new TypeCheckSimp(); TypeInstance res = root.accept(ts, null); // Ugly code not to be inspired from: "my" way of storing // type info / typecheck property: if some of my internal // structure is empty, then things don't typecheck for // me. This is specific to my own implementation. // if (res != null && res.type_array.size() > 0) if (res.get_type() != TypeEnum.ERROR) System.out.println("Program type checked successfully"); else System.out.println("Type error"); } catch (ParseException e) { System.out.println(e.toString()); System.exit(1); } } }