【发布时间】: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