对于某些规则使分号可选,同时保持尾随分号可选?

时间:2013-06-17 23:25:07

标签: antlr antlr3

我正在尝试为某些规则选择分号,同时保留最后一个分号可选。目前我们有像

这样的东西
A: 'A';
B: 'B';
C: 'B';
SEMICOLON: ';';

exprs : expr (SEMICOLON expr)* SEMICOLON?;

expr : A | B | C

解析输入,如

A;
C;
B

但是现在我们希望分号对'A'是可选的。这意味着解析像

这样的东西
A
C;
B

我遇到问题的部分是将分号作为A的可选分区,同时仍然允许最后一个分号是可选的。有没有一种很好的方法可以做到这一点,还是我需要制作最后一个分号?

(想不出一个体面的标题所以随意改变它)

1 个答案:

答案 0 :(得分:2)

将SEMICOLON符号移动到expr(无论如何它在语义上都属于那个)。

expr:
    A SEMICOLON?
    | (B | C) {LA(1) != EOF}? SEMICOLON
;

exprs:
    expr+
;

更新:更改了B和C分支以使用前瞻来决定。