[英]ANTLR: return always the same number of children
我有以下规则:
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目标。
谢谢,
T.
您可以这样做:
grammar G;
tokens {
CHILD1;
CHILD2;
CHILD3;
}
...
statement
: ROOT t2=TOKEN2? t3=TOKEN3? t4=TOKEN4?
-> ^(ROOT ^(CHILD1 $t2?) ^(CHILD2 $t3?) ^(CHILD3 $t4?))
;
这将导致AST始终具有3个子节点(作为子节点本身可能有或没有令牌)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.