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

Antlr4 ANTLR 4:如果使用谓词,则没有可行的替代方案,antlr4,Antlr4,输入 (001) 规则消息不产生可行的替代方案: [@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' 它解决了这个问

输入

(001)

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

[@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'
它解决了这个问题。 为什么在第一种情况下会出现错误?

您的谓词说“仅当
I
正好是3时才匹配以下内容”。由于
i
最初为0,因此谓词表示不会匹配
数字

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

编辑:您的谓词在Java中等同于以下内容:

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

如果我使用下一个规则
seqnum locals[int I=1;]:({$I Tnank you!您能提供与regexp的
\d{2,3}
\d{3}
等价的ANTLR吗?或者唯一的方法是
(数字)
第一位和
第二位的
最佳等效于
\d{2,3}
将是
数字
。最佳等效于
\d{3}
将是
数字
。最佳等效于\d{2,3}会是数字吗?这是陈述还是问题?当我得到输入
12
和规则
seq:INT INT INT;
行1:2缺少INT时,那么对于regexp
\d{1,4}
我是否需要下一个规则
(数字|数字|数字|数字)
?这是一个语句。与
\d{1,4}
最等效的是
数字(DIGIT(DIGIT-digital?)
(现在应该有足够的例子来构造任何下限/上限)。
message
    : '(' DIGIT DIGIT DIGIT ')'
    ;
for (int i = 0; i == 3; i++) {
    // do this 3 times
}