+ public void emitCode(EmitContext cx, PrintWriter pw, String packageName, String className) {
+ pw.println("package " + packageName + ";");
+ pw.println("public class " + className + " {");
+ // FIXME: root walking method
+ //pw.println(" public static XXX walk() root");
+ for(NonTerminalNode nt : values()) {
+ if (!(nt.name.charAt(0) >= 'A' && nt.name.charAt(0) <= 'Z')) continue;
+ StringBuffer fieldDeclarations = new StringBuffer();
+ StringBuffer walkCode = new StringBuffer();
+ nt.getUnionNode().emitCode(cx, fieldDeclarations, walkCode);
+ if (nt.tagged) {
+ pw.println(" public static class " + nt.name + "{");
+ pw.println(fieldDeclarations);
+ pw.println(" }");
+ pw.println(" public static " + nt.name + " walk"+nt.name+"(Tree t) {");
+ pw.println(" int i = 0;");
+ pw.println(walkCode);
+ pw.println(" }");
+ } else {
+ // FIXME; list who extends it
+ pw.println(" public static interface " + nt.name + "{ }");
+ // FIXME: what on earth is this going to be?
+ pw.println(" public static " + nt.name + " walk"+nt.name+"(Tree t) {");
+ pw.println(" throw new Error(\"FIXME\");");
+ pw.println(" }");
+ }
+ }
+ pw.println("}");
+ }