【发布时间】:2018-11-16 20:58:20
【问题描述】:
在构建 AST 并将子级添加到树时,有什么区别:
void NonTerminal #Nonterminal: { Token t;}
{
t = <MULTIPLY> OtherNonTerminal() {jjtThis.value = t.image;} #Multiply
}
和:
void NonTerminal : { Token t;}
{
t = <MULTIPLY> OtherNonTerminal() {jjtThis.value = t.image;} #Multiply(2)
}
注意:
<MULTIPLY : "*">
是否有任何重大差异?两者的工作方式是否相同?
还有另一种为这个生产规则构建树的方法:
void NonTerminal() : { Token t; }
{
t = <MULTIPLY> OtherNonTerminal() { jjtThis.value = t.image; } #Mult(2)
| t = <DIVIDE> OtherNonTerminal() { jjtThis.value = t.image; } #Div(2)
| {}
}
像这样:
void NonTerminal() #Nonterminal(2) : { Token t; }
{
(t = <MULTIPLY> OtherNonTerminal() | t = <DIVIDE> OtherNonTerminal() | {}) {jjtThis.value = t.image;}
}
【问题讨论】:
-
“NODE_DEFAULT_VOID”选项是否设置为
true? -
是的,它设置为真。 @TheodoreNorvell
标签: java parsing compiler-construction abstract-syntax-tree javacc