ANTLR:始终返回相同数量的子对象

ANTLR:始终返回相同数量的子对象,antlr,abstract-syntax-tree,Antlr,Abstract Syntax Tree,我有以下规则: statement : TOKEN1 opt1=TOKEN2? opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1? opt2); 此规则生成的AST将有一个或两个子项,具体取决于 opt1是否已定义 在这种情况下,我需要有固定数量的孩子2。我知道 这可以通过执行以下操作来实现:未定义的是虚拟令牌: statement : TOKEN1 opt1=TOKEN2 TOKEN4 -> ^(TOKEN1 opt1 UNDEFINED)

我有以下规则:

statement : TOKEN1 opt1=TOKEN2? opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1? opt2);
此规则生成的AST将有一个或两个子项,具体取决于 opt1是否已定义

在这种情况下,我需要有固定数量的孩子2。我知道 这可以通过执行以下操作来实现:未定义的是虚拟令牌:

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个子节点,这些子节点本身可能有或可能没有令牌