Beispiel #1
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());
  }