Skip to content
Snippets Groups Projects
AbstractGrammar.jadd 5.33 KiB
aspect BackendAbstractGrammar {

  public static String ASTNode.listInterface = "java.util.List";
  public static String ASTNode.listClass = "java.util.ArrayList";
  public static String ASTNode.jastAddListType = "List";
  public static String ASTNode.jastAddOptType = "Opt";

  public String Program.generateAbstractGrammar() {
    StringBuilder sb = new StringBuilder();
    generateAbstractGrammar(sb);
    return sb.toString();
  }

  public void Program.generateAbstractGrammar(StringBuilder b) {
    for (GrammarFile file : getGrammarFileList()) {
      file.generateAbstractGrammar(b);
    }
  }

  public String GrammarFile.generateAbstractGrammar() {
    StringBuilder sb = new StringBuilder();
    generateAbstractGrammar(sb);
    return sb.toString();
  }

  public void Grammar.generateAbstractGrammar(StringBuilder b) {
    for (Declaration decl : getDeclarationList()) {
      decl.generateAbstractGrammar(b);
    }
  }

  public void Declaration.generateAbstractGrammar(StringBuilder b) {
    for (Comment comment : getCommentList()) {
      comment.generateAbstractGrammar(b);
    }
  }

  public void EmptyDeclaration.generateAbstractGrammar(StringBuilder b) {
    super.generateAbstractGrammar(b);
  }

  public void TypeDecl.generateAbstractGrammar(StringBuilder b) {
    if (getAbstract()) {
      b.append("abstract ");
    }
    b.append(getName()).append(" ");
    if (hasSuperType()) {
      b.append(": ").append(getSuperType().getName()).append(" ");
    }
    b.append("::=");
    for (Component component : getComponentList()) {
      b.append(" ");
      component.generateAbstractGrammar(b);
    }
    b.append(";");
    super.generateAbstractGrammar(b);
  }

  public abstract void Component.generateAbstractGrammar(StringBuilder b);

  public void NormalComponent.generateAbstractGrammar(StringBuilder b) {
    if (getNTA()) {
      b.append("/");
    }

    if (!getName().equals("")) {
      b.append(getName()).append(":");
    }
    b.append(getTypeDecl().getName());
    if (getNTA()) {
      b.append("/");
    }
  }

  public void ListComponent.generateAbstractGrammar(StringBuilder b) {
    if (getNTA()) {
      b.append("/");
    }

    if (!getName().equals("")) {
      b.append(getName()).append(":");
    }
    b.append(getTypeDecl().getName()).append("*");
    if (getNTA()) {
      b.append("/");
    }
  }

  public void OptComponent.generateAbstractGrammar(StringBuilder b) {
    if (getNTA()) {
      b.append("/");
    }
    b.append("[");
    if (!getName().equals("")) {
      b.append(getName()).append(":");
    }
    b.append(getTypeDecl().getName()).append("]");
    if (getNTA()) {
      b.append("/");
    }
  }

  public void TokenComponent.generateAbstractGrammar(StringBuilder b) {
    if (getNTA()) {
      b.append("/");
    }
    b.append("<");
    if (!getName().equals("")) {
      b.append(getName());
      if (hasJavaTypeUse()) {
        b.append(":");
      }
    }
    if (hasJavaTypeUse()) {
      getJavaTypeUse().generateAbstractGrammar(b);
    }
    b.append(">");
    if (getNTA()) {
      b.append("/");
    }
  }

  abstract public void JavaTypeUse.generateAbstractGrammar(StringBuilder b);

  public void SimpleJavaTypeUse.generateAbstractGrammar(StringBuilder b) {
    b.append(getName());
  }

  public void ParameterizedJavaTypeUse.generateAbstractGrammar(StringBuilder b) {
    b.append("<");
    boolean first = true;
    for (JavaTypeUse javaTypeUse : getJavaTypeUseList()) {
      if (first) {
        first = false;
      } else {
        b.append(", ");
      }
      javaTypeUse.generateAbstractGrammar(b);
    }
    b.append(">");
  }

  public void Relation.generateAbstractGrammar(StringBuilder b) {
    super.generateAbstractGrammar(b);
  }

  public void DirectedRelation.generateAbstractGrammar(StringBuilder b) {
    b.append("rel ");
    getSource().generateAbstractGrammar(b);
    b.append(" -> ");
    getTarget().generateAbstractGrammar(b);
    b.append(";");
    super.generateAbstractGrammar(b);
  }

  public void BidirectionalRelation.generateAbstractGrammar(StringBuilder b) {
    b.append("rel ");
    getLeft().generateAbstractGrammar(b);
    b.append(" <-> ");
    getRight().generateAbstractGrammar(b);
    b.append(";");
    super.generateAbstractGrammar(b);
  }

  abstract public void Role.generateAbstractGrammar(StringBuilder b);

  public void NormalRole.generateAbstractGrammar(StringBuilder b) {
    b.append(getType().getName()).append(".").append(getName());
  }

  public void ListRole.generateAbstractGrammar(StringBuilder b) {
    b.append(getType().getName()).append(".").append(getName()).append("*");
  }

  public void OptRole.generateAbstractGrammar(StringBuilder b) {
    b.append(getType().getName()).append(".").append(getName()).append("?");
  }

  public void UnnamedRole.generateAbstractGrammar(StringBuilder b) {
    b.append(getType().getName());
  }

  abstract public void Comment.generateAbstractGrammar(StringBuilder b);

  public void WhitespaceComment.generateAbstractGrammar(StringBuilder b) {
    b.append(getText());
  }

  public void SingleLineComment.generateAbstractGrammar(StringBuilder b) {
    b.append("//").append(getText()).append("\n");
  }

  public void MultiLineComment.generateAbstractGrammar(StringBuilder b) {
    b.append("/*").append(getText()).append("*/");
  }

  public void DocComment.generateAbstractGrammar(StringBuilder b) {
    b.append("/**").append(getText()).append("*/");
  }

}