0

输入

(001)

grammar G;

message
    : '(' seqnum ')'
    ;

seqnum
locals [int i = 0;]
    : ( {$i == 3}? DIGIT {$i++;} )+
    ;

DIGIT
    : [0-9]
    ;

规则消息没有产生可行的替代方案:

[@0,0:0='(',<2>,1:0]
[@1,1:1='0',<3>,1:1]
[@2,2:2='0',<3>,1:2]
[@3,3:3='1',<3>,1:3]
[@4,4:4=')',<1>,1:4]
[@5,5:4='<EOF>',<-1>,1:5]
line 1:1 no viable alternative at input '0'

如果将规则“消息”重写为

message
    : '(' DIGIT DIGIT DIGIT ')'
    ;

它解决了这个问题。为什么我在第一种情况下得到错误?

4

1 回答 1

2

您的谓词说“如果恰好是 3,则仅匹配以下内容i”。由于i最初为 0,谓词意味着no DIGIT将永远匹配。

ANTLR 中的一般规则是仅在绝对必要时使用谓词,因为它们会带来显着的性能开销并且在出现问题时难以调试。

编辑:您的谓词相当于Java中的以下内容:

for (int i = 0; i == 3; i++) {
    // do this 3 times
}
于 2013-11-13T13:26:31.577 回答