1

我有一个看起来像这样的规则:

a : (b | c) d;

b : 'B';

c : 'C';

d : 'D';

使用这种语法,ANTLR 构建了一个扁平的解析树。如何重写第一条规则(并保持其他两条不变),以便在名为 A 的根节点下返回匹配的内容?

如果第一条生产规则是这样的:

a : b d;

那么它可以被重写为

a : b d -> ^(A b d)

它会解决我的问题。然而,第一个语法规则为生成的解析树产生了不止一种可能性,^(A b d)或者^(A c d).

重写规则时如何表达这一点?

4

1 回答 1

2

您可以?在重写中使用运算符,如下所示。

a : (b | c) d -> ^(A b? c? d);
于 2013-05-08T13:54:26.823 回答