예제 #1
0
  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);
  }
예제 #2
0
  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);
  }
예제 #3
0
  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());
  }