我有以下规则:
statement : TOKEN1 opt1=TOKEN2? opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1? opt2);
此规则生成的AST将有一个或两个孩子(取决于是否 是否定义了opt1。
我需要总是有一定数量的孩子(在这种情况下是2)。我知道
这可以通过执行以下操作来实现(UNDEFINED
是一个虚构的标记):
statement : TOKEN1 opt1=TOKEN2 TOKEN4 -> ^(TOKEN1 opt1 UNDEFINED)
| TOKEN1 opt1=TOKEN2 opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1 opt2);
仅适用于一个可选令牌。问题是当我有更高的时候 可选令牌的数量。必须编写许多规则才能捕获所有规则 可能的组合。如何以优雅的方式解决这个问题?
顺便说一句,我正在使用ANTLR 3.4 / C目标。
谢谢,
吨。
答案 0 :(得分:0)
你可以这样做:
grammar G;
tokens {
CHILD1;
CHILD2;
CHILD3;
}
...
statement
: ROOT t2=TOKEN2? t3=TOKEN3? t4=TOKEN4?
-> ^(ROOT ^(CHILD1 $t2?) ^(CHILD2 $t3?) ^(CHILD3 $t4?))
;
这会导致AST总是有3个子节点(可能有也可能没有作为子节点的标记)。