ANTLR 4:如果使用谓词,则没有可行的替代方案

时间:2013-11-13 12:32:10

标签: antlr4

输入

(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'为

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

for (int i = 0; i == 3; i++) {
    // do this 3 times
}