Antlr 将分号设置为某些规则的可选分号,同时保留尾随分号的可选分号?

Antlr 将分号设置为某些规则的可选分号,同时保留尾随分号的可选分号?,antlr,antlr3,Antlr,Antlr3,我试图使分号对于某些规则是可选的,同时保持最后一个分号是可选的。目前我们有类似的 A: 'A'; B: 'B'; C: 'B'; SEMICOLON: ';'; exprs : expr (SEMICOLON expr)* SEMICOLON?; expr : A | B | C A C; B 用于解析输入,如 A; C; B 但是现在我们希望分号对于“A”是可选的。这意味着解析类似于 A: 'A'; B: 'B'; C: 'B'; SEMICOLON: ';'; exprs : e

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

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

exprs : expr (SEMICOLON expr)* SEMICOLON?;

expr : A | B | C
A
C;
B
用于解析输入,如

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

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

exprs : expr (SEMICOLON expr)* SEMICOLON?;

expr : A | B | C
A
C;
B
我遇到的问题是,在一段时间内分号是可选的,而最后一个分号仍然是可选的。有没有一个很好的方法可以做到这一点,或者我应该只需要最后一个分号


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

将分号符号移动到expr(从语义上讲,它无论如何都属于expr)


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

这将使最后一行需要分号,但如果它以C结尾。因此,如果B和C不是最后一行,则需要分号。如果没有分号,是否有方法结束expr+匹配?检查EOF对我的案例不起作用,因为EXPR之后会有更多的令牌。您需要定义EXPR的终止方式。必须有一个可以使用的条件,特别是对于可选的结束符(这通常使解析器的工作更加困难)。如果全部失败,您可以使用语义谓词来检查a、B和C是否都在后面。这可能需要语义谓词。这只是一个如何做的问题。我想做一些类似于“循环”部分的事情。但是({false}?=>expr)*没有生成中断。相反,它只是抛出一个FailedPredicateException。我只能重复一次:您需要一个确切指定EXPR何时完成的条件。这必须是一个标记,因此您可以在谓词中使用它来检查分号或此标记。我在上面使用了EOF,但其他令牌也使用。是否可以使用EXPR后面的第一个标记(例如,右括号)?您可以有多个令牌(例如{LA(1)=EOF | | LA(1)==''))?…等。