这是我精简的 ANTLR4 语法(注意我使用常量 false 来替换返回 false 的方法):
grammar AnnotProcessor;
cppCompilationUnit: content+ EOF;
content: anything
| {false}? .;
anything: ANY_CHAR;
ANY_CHAR: [_a-zA-Z0-9];
我的测试文件只包含 1 个单词“hello”,测试结果如下:
D:\work\antlr4\work>java org.antlr.v4.runtime.misc.TestRig AnnotProcessor cppCompilationUnit -tree in.cpp
line 1:5 no viable alternative at input '<EOF>'
(cppCompilationUnit (content (anything h)) (content (anything e)) (content (anything l)) (content (anything l)) (content (anything o)))
D:\work\antlr4\work>java org.antlr.v4.runtime.misc.TestRig AnnotProcessor cppCompilationUnit -tokens in.cpp
[@0,0:0='h',<1>,1:0]
[@1,1:1='e',<1>,1:1]
[@2,2:2='l',<1>,1:2]
[@3,3:3='l',<1>,1:3]
[@4,4:4='o',<1>,1:4]
[@5,5:4='<EOF>',<-1>,1:5]
line 1:5 no viable alternative at input '<EOF>'
为什么当我添加一个语义谓词(虽然这里是一个虚拟的)作为替代时,它一直说“输入 '< EOF >' 的第 1:5 行没有可行的替代方案”?如果我删除带有错误语义谓词的替代项,则错误会按预期消失。
PS:我正在使用 antlr-4.0-complete.jar