我正在尝试为某些规则选择分号,同时保留最后一个分号可选。目前我们有像
这样的东西A: 'A';
B: 'B';
C: 'B';
SEMICOLON: ';';
exprs : expr (SEMICOLON expr)* SEMICOLON?;
expr : A | B | C
解析输入,如
A;
C;
B
但是现在我们希望分号对'A'是可选的。这意味着解析像
这样的东西A
C;
B
我遇到问题的部分是将分号作为A的可选分区,同时仍然允许最后一个分号是可选的。有没有一种很好的方法可以做到这一点,还是我需要制作最后一个分号?
(想不出一个体面的标题所以随意改变它)
答案 0 :(得分:2)
将SEMICOLON符号移动到expr(无论如何它在语义上都属于那个)。
expr:
A SEMICOLON?
| (B | C) {LA(1) != EOF}? SEMICOLON
;
exprs:
expr+
;
更新:更改了B和C分支以使用前瞻来决定。