是ANTLR4 EOF Bug还是我的错误

时间:2013-04-12 16:51:05

标签: antlr4

这是我修剪过的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>'

为什么当我添加一个语义谓词(虽然这里是假人)作为替代时,它一直说“第1:5行在输入时没有可行的选择'&lt; EOF&gt;'”?如果我使用假语义谓词删除备选项,则错误将按预期消失。

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

1 个答案:

答案 0 :(得分:1)

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

你能在这里报告这个问题:
https://github.com/antlr/antlr4/issues

编辑:这是问题#218,现已修复
https://github.com/antlr/antlr4/issues/218

PS:您在+?规则中对非贪婪运算符cppCompilationUnit的使用是不必要的或不正确的。如果您打算要求至少一个content元素,则只需使用+即可。但是,我认为您打算写的是零个或多个content元素:(content+)?,可以简化为content*