Метод дампа JavaCC для печати AST

Я использую JavaCC для печати AST в определенном формате. Мне нужно, чтобы это было так:

LetNode( Identier(X), ExprNode( PlusNode( IntegerLiteral(8), IntegerLiteral(2) ))) 

но я получаю:

Start(LetNode(Identifier(x)(ExprNode(IntegerLiteral(5)(PlusNode(IntegerLiteral(5)()))

Я использую метод дампа, чтобы напечатать это:

public void dump(String prefix) {
  System.out.print(toString(prefix));
  System.out.print("(");
  if (children != null) {

    for (int i = 0; i < children.length; ++i) {
      SimpleNode n = (SimpleNode)children[i];
      if (n != null) {
        n.dump(prefix +"");
      }
    }
    System.out.print(")");
  }
}

}

Выход без каких-либо изменений:

Start
  Sxl
   Statement
    VariableDecl
     Identifier
     Type
     Expression
      SimpleExpression
       Term
        Factor
         Literal
          IntegerLiteral
       AdditiveOp
       Term
        Factor
         Literal
          IntegerLiteral

Мой метод:

void AdditiveOp():
{}  
{
   (Plus() /*#Add(2)*/ | Minus() | Or())

}

void Plus():
{
}
{
  (< PLUS >)
  #PlusNode
}

Если я удаляю /* */ он не работает, так как он говорит, что ожидает чего-то другого, но не +

Любая помощь будет принята с благодарностью!

1 ответ

Решение

Обычный способ сделать AST с JJT для грамматики выражения - сделать что-то вроде этого

void AdditiveExpression() #void :
{ Token t ; }
{
  MultiplicativeExpression()
  (  "+"  MultiplicativeExpression()  #Add(2)
  |  "-"  MultiplicativeExpression()  #Subtract(2)   
  )*
}
Другие вопросы по тегам