1

我有以下规则:

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。

4

1 回答 1

0

你可以这样做:

grammar G;

tokens {
  CHILD1;
  CHILD2;
  CHILD3;
}

...

statement
 : ROOT t2=TOKEN2? t3=TOKEN3? t4=TOKEN4?
   -> ^(ROOT ^(CHILD1 $t2?) ^(CHILD2 $t3?) ^(CHILD3 $t4?))
 ;

这将导致 AST 始终有 3 个子节点(它们本身可能有也可能没有令牌作为子节点)。

于 2013-08-29T07:00:08.797 回答