是ANTLR4 EOF错误还是我的错误

是ANTLR4 EOF错误还是我的错误,antlr4,Antlr4,这是我精简的ANTLR4语法(注意,我使用常量false替换返回false的方法): 我的测试文件只包含一个单词“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>' (cppCompilation

这是我精简的ANTLR4语法(注意,我使用常量false替换返回false的方法):

我的测试文件只包含一个单词“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>'
D:\work\antlr4\work>java org.antlr.v4.runtime.misc.TestRig AnnotProcessor cppcomilationunit-tree in.cpp
第1行:5输入“”处无可行的替代方案
(CPP编译单元(内容(任何h))(内容(任何e))(内容(任何l))(内容(任何l))(内容(任何o)))
D:\work\antlr4\work>java org.antlr.v4.runtime.misc.TestRig AnnotProcessor cppcomilationunit-tokens in.cpp
[@0,0:0='h',1:0]
[@1,1:1='e',1:1]
[@2,2:2='l',1:2]
[@3,3:3='l',1:3]
[@4,4:4='o',1:4]
[@5,5:4='',,1:5]
第1行:5输入“”处无可行的替代方案
当我添加一个语义谓词(虽然这里是一个伪谓词)作为替代时,为什么它总是说“第1:5行输入“”没有可行的替代方案?”?如果我删除带有假语义谓词的替代项,错误将按预期消失


PS:我正在使用antlr-4.0-complete.jar

是的,这是一个bug。在ANTLR 4中,在语法中的任何地方引入以
{false}?
[几乎]开头的替代项都不会影响任何[有效]输入的解析结果

你能在这里报告这个问题吗:

编辑:这是问题#218,现已修复


注:在
cppcomilationunit
规则中,使用非贪婪运算符
+?
是不必要的或不正确的。如果您希望至少需要一个
内容
元素,只需使用
+
。但是,我认为您想要编写的内容是零个或多个
内容
元素:
(content+)
,可以简化为
内容*

是的,这是一个bug。在ANTLR 4中,在语法中的任何地方引入以
{false}?
[几乎]开头的替代项都不会影响任何[有效]输入的解析结果

你能在这里报告这个问题吗:

编辑:这是问题#218,现已修复


注:在
cppcomilationunit
规则中,使用非贪婪运算符
+?
是不必要的或不正确的。如果您希望至少需要一个
内容
元素,只需使用
+
。然而,我认为你想写的是零个或更多的
内容
元素:
(content+)
,可以简化为
内容*

我最初的帖子对“内容”使用了一个非贪婪的+元素,经过进一步测试,不会导致错误。只有在使用贪婪的错误时,才会出现该错误。请看我编辑的语法。这正常吗?我原来的帖子用了一个非贪婪+来表示“内容”,经过进一步测试,它不会导致错误。只有在使用贪婪的错误时,才会出现该错误。请看我编辑的语法。这正常吗?
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>'