ANTLR:总是返回相同数量的孩子

时间:2013-08-29 06:55:45

标签: antlr abstract-syntax-tree

我有以下规则:

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目标。

谢谢,

吨。

1 个答案:

答案 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个子节点(可能有也可能没有作为子节点的标记)。