public VisiteurEggJava(TDS t) { table = t; nterms = new Vector<NtJava>(); lex = new LexJava(t); mod = new ModJava(t); mess = new MJava(t); if (t.syntaxOnly()) vact = new VisiteurActionNull(t); else vact = new VisiteurActionJava(t); }
public void finaliser() throws EGGException { IEGGCompilationUnit cu = table.getCompilationUnit(); if (!cu.isOk()) return; // a changer puisqu'on ne serialise plus la tds cu.writeTds(table); // modif get package straight from prefix String ngen = table.directory().replace('\\', '/'); String pack = ngen.replace('/', '.'); if (!"".equals(table.prefix())) pack = table.prefix() + "." + pack; Vector<String> incs = table.getOptions().getLibs(); lex.finaliser(pack, incs); if (comp != null) { comp.finaliser(pack, incs); } // pour les modules if (mod != null) { mod.finaliser(pack, incs); } for (NtJava nt : nterms) { nt.finaliser(pack, incs); } // finaliser les messages d'erreurs mess.finaliser(pack); if (table.getDst()) genVisitor(pack, incs); }
private void genVisitor(String pack, Vector<String> incs) throws EGGException { String nom = table.getNom() + "Visitor"; StringBuffer sb = new StringBuffer(); sb.append("package " + pack + ";\n"); for (String e : incs) { sb.append("import " + e + ";\n"); } sb.append("import mg.egg.eggc.runtime.libjava.*;\n"); // création de la classe sb.append("public class " + nom + " implements IDstVisitor {\n"); sb.append("protected boolean visitNode(IDstNode node){\n return true;}\n"); sb.append("public boolean visit(IDstNode node){\n"); // les visiteurs externes Vector<String> evs = new Vector<String>(); // redirection vers les visiteurs specifiques for (NtJava nt : nterms) { if (nt.estExterne()) { String en = nt.getNom(); evs.add(en); sb.append(" if (node.getClass() == c" + en + "){\n"); sb.append(" node.accept(f" + en + "Visitor);\n"); sb.append(" }\n"); } else { sb.append(" if (node instanceof " + nt.getNomClasse() + ")\n"); sb.append(" return visit((" + nt.getNomClasse() + ") node);\n"); } } // le terminal sb.append(" if (node instanceof T_" + table.getNom() + ")\n"); sb.append(" return visit((T_" + table.getNom() + ") node);\n"); sb.append(" return false;\n}\n"); sb.append("public void endVisit(IDstNode node){\n"); // redirection vers les visiteurs spécifiques for (NtJava nt : nterms) { if (!nt.estExterne()) { sb.append(" if (node instanceof " + nt.getNomClasse() + ")\n"); sb.append(" endVisit((" + nt.getNomClasse() + ") node);\n"); } } sb.append(" }\n"); // declaration des externes for (String ev : evs) { sb.append("private Class c" + ev + "= new " + ev + "().getAxiom().getClass();\n"); sb.append("public " + ev + "Visitor f" + ev + "Visitor;\n"); } // creation du constructeur sans arg sb.append("public " + nom + "("); int i = 0; for (String ev : evs) { sb.append(ev + "Visitor v" + ++i); if (i < evs.size()) sb.append(","); } i = 1; sb.append("){\n"); for (String ev : evs) { sb.append(" f" + ev + "Visitor = v" + i++ + ";\n"); } sb.append(" }\n"); // création du constructeur avec arg if (evs.size() != 0) { sb.append("public " + nom + "(){\n"); for (String ev : evs) { sb.append(" f" + ev + "Visitor = new " + ev + "Visitor();\n"); } sb.append(" }\n"); } // création des visiteurs spécifiques pour les non-terminaux for (NtJava nt : nterms) { if (nt.estExterne()) continue; sb.append( "public boolean visit(" + nt.getNomClasse() + " node ){\n return visitNode(node);\n}\n"); sb.append("public void endVisit(" + nt.getNomClasse() + " node){\n}\n"); } // idem pour les terminaux sb.append("public boolean visit(T_" + table.getNom() + " node){\n return false;}\n"); sb.append("public void endVisit(T_" + table.getNom() + " node){\n}\n"); sb.append("}\n"); table.getCompilationUnit().createFile(nom + ".java", sb.toString()); }