// // Visitor generation methods // public void generateDepthFirstVisitor() throws FileExistsException { try { File file = new File(visitorDir, outFilename); if (Globals.noOverwrite && file.exists()) throw new FileExistsException(outFilename); PrintWriter out = new PrintWriter(new FileOutputStream(file), false); Spacing spc = new Spacing(INDENT_AMT); out.println(Globals.fileHeader(spc)); out.println(); out.println(spc.spc + "package " + Globals.visitorPackage + ";"); if (!Globals.visitorPackage.equals(Globals.nodePackage)) out.println(spc.spc + "import " + Globals.nodePackage + ".*;"); out.println(spc.spc + "import java.util.*;\n"); out.println(spc.spc + "/**"); out.println( spc.spc + " * Provides default methods which visit each " + "node in the tree in depth-first"); out.println(spc.spc + " * order. Your visitors may extend this class."); out.println(spc.spc + " */"); out.println( spc.spc + "public class " + visitorName + "<R,A> implements " + Globals.GJVisitorName + "<R,A> {"); printAutoVisitorMethods(out); spc.updateSpc(+1); out.println(spc.spc + "//"); out.println(spc.spc + "// User-generated visitor methods below"); out.println(spc.spc + "//"); out.println(); for (Enumeration e = classList.elements(); e.hasMoreElements(); ) { ClassInfo cur = (ClassInfo) e.nextElement(); String name = cur.getName(); out.println(spc.spc + "/**"); if (Globals.javaDocComments) out.println(spc.spc + " * <PRE>"); out.println(cur.getEbnfProduction(spc)); if (Globals.javaDocComments) out.println(spc.spc + " * </PRE>"); out.println(spc.spc + " */"); out.print(spc.spc + "public R visit"); out.println("(" + name + " n, A argu) {"); spc.updateSpc(+1); out.println(spc.spc + "R _ret=null;"); for (Enumeration f = cur.getNameList().elements(); f.hasMoreElements(); ) out.println(spc.spc + "n." + (String) f.nextElement() + ".accept(this, argu);"); out.println(spc.spc + "return _ret;"); spc.updateSpc(-1); out.println(spc.spc + "}\n"); } spc.updateSpc(-1); out.println(spc.spc + "}"); out.flush(); out.close(); } catch (IOException e) { Errors.hardErr("Could not generate " + outFilename); } }