ANTLR4中抛出的java.lang.IndexOutOfBoundsException

ANTLR4中抛出的java.lang.IndexOutOfBoundsException,antlr4,Antlr4,我正在编写语法分析器,遇到了一个棘手的错误。 我的规则之一如下: operatorTerm[ReadOptions Options, int priority] returns [Term t] @init { int p = priority; Term t2 = null; Term t = null; CompoundTermTag f = null; } : {testFY($Options, $priority)}? a=op[$Options, p]

我正在编写语法分析器,遇到了一个棘手的错误。 我的规则之一如下:

operatorTerm[ReadOptions Options, int priority] returns [Term t]
@init
{
int p = priority;
Term t2 = null;
Term t = null;
CompoundTermTag f = null;
}     
    : {testFY($Options, $priority)}?
      a=op[$Options, p]     {f = $a.tag;}
      b=term[$Options, p]   {$t = $b.t; $t = createTerm(f, $t); }
    | {testFX($Options, $priority)}?
      d=op[$Options, p]     {f = $d.tag;}
      e=term[$Options, p-1] {$t = $e.t; $t = createTerm(f, $t);}
    ;
这将使用别名ANTLR4引发以下错误

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 199, Size: 199
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at org.antlr.v4.automata.ATNSerializer.serialize(ATNSerializer.java:201)
at org.antlr.v4.automata.ATNSerializer.getSerialized(ATNSerializer.java:375)
at org.antlr.v4.codegen.model.SerializedATN.<init>(SerializedATN.java:46)
at org.antlr.v4.codegen.model.Parser.<init>(Parser.java:96)
at org.antlr.v4.codegen.ParserFactory.parser(ParserFactory.java:92)
at org.antlr.v4.codegen.OutputModelController.parser(OutputModelController.java:165)
at org.antlr.v4.codegen.OutputModelController.buildParserOutputModel(OutputModelController.java:114)
at org.antlr.v4.codegen.CodeGenerator.generateParser(CodeGenerator.java:169)
at org.antlr.v4.codegen.CodeGenPipeline.process(CodeGenPipeline.java:73)
at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:422)
at org.antlr.v4.Tool.process(Tool.java:384)
at org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:343)
at org.antlr.v4.Tool.main(Tool.java:190)
线程“main”java.lang.IndexOutOfBoundsException中的异常:索引:199,大小:199 位于java.util.ArrayList.rangeCheck(ArrayList.java:604) 获取(ArrayList.java:382) 位于org.antlr.v4.automata.ATNSerializer.serialize(ATNSerializer.java:201) 位于org.antlr.v4.automata.ATNSerializer.getSerialized(ATNSerializer.java:375) 位于org.antlr.v4.codegen.model.SerializedATN.(SerializedATN.java:46) 位于org.antlr.v4.codegen.model.Parser(Parser.java:96) 位于org.antlr.v4.codegen.ParserFactory.parser(ParserFactory.java:92) 位于org.antlr.v4.codegen.OutputModelController.parser(OutputModelController.java:165) 位于org.antlr.v4.codegen.OutputModelController.buildParserOutputModel(OutputModelController.java:114) 位于org.antlr.v4.codegen.CodeGenerator.generateParser(CodeGenerator.java:169) 位于org.antlr.v4.codegen.CodeGenPipeline.process(CodeGenPipeline.java:73) 位于org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:422) 位于org.antlr.v4.Tool.process(Tool.java:384) 位于org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:343) 位于org.antlr.v4.Tool.main(Tool.java:190) 现在,如果我从代码中删掉几行,这将编译。创建此新规则引发了此异常。另外,如果我从这个规则本身删去几行,那么就不会抛出异常

是不是因为我的语法太大了? 无法找出这个错误

而且,即使我删掉了其他一些独立规则,我也没有遇到这样的错误。语法文件的大小有限制吗


我的语法文件大约有800行。

这听起来像是特定版本的ANTLR 4工具中的一个bug。您可以向GitHub上的项目问题跟踪器报告错误:


注意:我无法在最新的源代码中重现此问题,该源代码将在本月底发布的ANTLR 4.1中提供。

这听起来像是ANTLR 4工具特定版本中的错误。您可以向GitHub上的项目问题跟踪器报告错误:


注意:我无法在最新的源代码中重现这个问题,该源代码将在本月底发布为ANTLR 4.1。

ANTLR解析器生成器版本4.0它的确切版本是4.0,正如我所说,删除一些其他规则将使这项工作正常。语法文件的长度不允许编译。您可以查看我的github repo,在那里可以找到我的完整语法文件。另外,明确使用4.0,我已经安装了4.0-complete-jar:您可以按照上面的链接在文件上运行antlr来遇到这个错误。我刚刚在Github上浏览了您的语法,看到了以下内容:
['E','E']
(以及更类似的内容)。您应该意识到这与
“'”
“E”
“、”
“E”
中的一个匹配。你可能想要:
[Ee]
,或者老式的
'E'|'E'
是的,我会纠正的。ANTLR社区真的很有帮助!谢谢Bart,你的教程也很有帮助。ANTLR解析器生成器4.0版绝对是4.0版,正如我所说,删掉一些其他规则会使这一切正常。语法文件的长度不允许编译。您可以查看我的github repo,在那里可以找到我的完整语法文件。另外,明确使用4.0,我已经安装了4.0-complete-jar:您可以按照上面的链接在文件上运行antlr来遇到这个错误。我刚刚在Github上浏览了您的语法,看到了以下内容:
['E','E']
(以及更类似的内容)。您应该意识到这与
“'”
“E”
“、”
“E”
中的一个匹配。你可能想要:
[Ee]
,或者老式的
'E'|'E'
是的,我会纠正的。ANTLR社区真的很有帮助!谢谢巴特,你的教程也很有帮助。那就意味着我只能切换我的编译器了?我的语法文件差不多写完了。我能指望它在ANTLR 4.2中得到解决吗?@RishabhGarg我的意思是,它似乎已经被修复,并将在4.1版本中正式发布。您也可以从源代码构建该工具,使其同时工作。对于误解您的评论,我深表歉意。非常感谢你。真的很有帮助!这意味着我只能切换我的编译器?我的语法文件差不多写完了。我能指望它在ANTLR 4.2中得到解决吗?@RishabhGarg我的意思是,它似乎已经被修复,并将在4.1版本中正式发布。您也可以从源代码构建该工具,使其同时工作。对于误解您的评论,我深表歉意。非常感谢你。真的很有帮助!