输入
(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 ')'
;
它解决了这个问题。 为什么我在第一种情况下得到错误?
答案 0 :(得分:2)
您的谓词说“如果i
正好是3”,则只匹配以下内容。由于i
最初为0,因此谓词意味着 no DIGIT
将匹配。
ANTLR中的一般规则是仅在绝对必要时使用谓词,因为它们会带来显着的性能开销,并且在出现问题时很难调试。
编辑:你的谓词相当于Java中的以下内容:
for (int i = 0; i == 3; i++) {
// do this 3 times
}