【问题标题】:JavaCC dump method to print ASTJavaCC转储方法打印AST
【发布时间】:2014-05-06 12:39:22
【问题描述】:

我正在使用 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
}

如果我删除 /* */ 它不起作用,因为它说它期望其他东西不是 +

任何帮助将不胜感激!

【问题讨论】:

  • 首先,您需要更改生成树的方式。目前,您基本上拥有解析树。您需要的是更多的抽象语法树。阅读 JJT 的文档以了解如何执行此操作。
  • 我做了,我修改了方法 dump() 事实上我得到了一些输出,正如我上面所说的。我所需要的只是在两个不在中间的整数之前获取 Plus 节点,但我不知道如何

标签: dump abstract-syntax-tree javacc


【解决方案1】:

使用 JJT 为表达式语法制作 AST 的常用方法是这样做

void AdditiveExpression() #void :
{ Token t ; }
{
  MultiplicativeExpression()
  (  "+"  MultiplicativeExpression()  #Add(2)
  |  "-"  MultiplicativeExpression()  #Subtract(2)   
  )*
}

【讨论】:

  • 关于“(2)”,您必须阅读JJT文档。简而言之,#Add(2) 意味着:(a) 从堆栈中弹出两个节点,(b) 创建一个 Add 类型的新节点,(c) 将这两个节点作为子节点添加到新节点,(d) 推送新节点堆栈上的节点。因此整个方法将 1 个节点压入堆栈,假设 MultiplicativeExpression 也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
相关资源
最近更新 更多