1

我正在尝试使分号对于某些规则是可选的,同时保持最后一个分号是可选的。目前我们有类似的东西

A: 'A';
B: 'B';
C: 'B';
SEMICOLON: ';';

exprs : expr (SEMICOLON expr)* SEMICOLON?;

expr : A | B | C

用于解析输入,例如

A;
C;
B

但是现在我们希望分号对于“A”是可选的。这意味着解析类似

A
C;
B

我遇到问题的部分是使分号对于 A 是可选的,同时仍然允许最后一个分号是可选的。有没有一种很好的方法可以做到这一点,或者我应该只需要最后一个分号?

(想不出一个像样的标题,所以随意更改它)

4

1 回答 1

2

Move the SEMICOLON symbol to expr (semantically it belongs to that anyway).

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

exprs:
    expr+
;

Update: changed the B and C branch to use a lookahead to decide.

于 2013-06-18T07:17:53.883 回答