Parsing 在包含许多规则的文件中跟踪ANTLR错误?

Parsing 在包含许多规则的文件中跟踪ANTLR错误?,parsing,antlr,antlr4,Parsing,Antlr,Antlr4,我将把它迁移到ANTLR v4格式 不幸的是,ANTLR中断,消息为找不到规则语法规范或树结构错误: can't find rule grammarSpec or tree structure error: (COMBINED_GRAMMAR Php (RULES (RULE start (BLOCK (ALT (top_statement_list 0)))) (RULE top_statement_list int _p (BLOCK (ALT (BLOCK (ALT {})) (* (

我将把它迁移到ANTLR v4格式

不幸的是,ANTLR中断,消息为
找不到规则语法规范或树结构错误

can't find rule grammarSpec or tree structure error: 
(COMBINED_GRAMMAR Php (RULES (RULE start (BLOCK (ALT (top_statement_list 0)))) 
(RULE top_statement_list int _p (BLOCK (ALT (BLOCK (ALT {})) (* (BLOCK (ALT {2 >= 
...

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.antlr.v4.parse.GrammarTreeVisitor.visit(GrammarTreeVisitor.java:206)
    at org.antlr.v4.parse.GrammarTreeVisitor.visitGrammar(GrammarTreeVisitor.java:200)
    at org.antlr.v4.semantics.SymbolCollector.process(SymbolCollector.java:76)
    at org.antlr.v4.semantics.SemanticPipeline.process(SemanticPipeline.java:103)
    at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:399)
    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)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
    at org.antlr.v4.semantics.SymbolCollector.discoverOuterAlt(SymbolCollector.java:111)
    at org.antlr.v4.parse.GrammarTreeVisitor.outerAlternative(GrammarTreeVisitor.java:2284)
    at org.antlr.v4.parse.GrammarTreeVisitor.ruleBlock(GrammarTreeVisitor.java:2197)
    at org.antlr.v4.parse.GrammarTreeVisitor.rule(GrammarTreeVisitor.java:1663)
    at org.antlr.v4.parse.GrammarTreeVisitor.rules(GrammarTreeVisitor.java:1241)
    at org.antlr.v4.parse.GrammarTreeVisitor.grammarSpec(GrammarTreeVisitor.java:480)
    ... 12 more
Exception in thread "main" java.lang.NullPointerException
    at org.antlr.v4.tool.LeftRecursiveRule.getAltLabels(LeftRecursiveRule.java:91)
    at org.antlr.v4.tool.Rule.hasAltSpecificContexts(Rule.java:200)
    at org.antlr.v4.tool.LeftRecursiveRule.hasAltSpecificContexts(LeftRecursiveRule.java:60)
    at org.antlr.v4.semantics.SymbolChecks.checkForLabelConflicts(SymbolChecks.java:150)
    at org.antlr.v4.semantics.SymbolChecks.process(SymbolChecks.java:98)
    at org.antlr.v4.semantics.SemanticPipeline.process(SemanticPipeline.java:107)
    at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:399)
    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)
如果我减少规则的数量,问题不会出现,但ANTLR会抱怨缺少符号


有人能提供如何追踪错误的提示吗?没有其他方法可以减少规则计数。

您的语法中出现了以下情况之一(问题中未包括):

  • 它包含一个ANTLR 4语法编译器无法恢复的语法错误

  • 您在ANTLR 4语法编译器中发现了一个bug,应该报告给


  • 实际上,语法包含一个递归规则。一旦我删除了递归,问题就消失了。@SteAp一些递归情况会导致ANTLR 4.0中出现异常。这些应在ANTLR 4.1中固定。如果您正在使用Antlr4.1,并且由于语法中的递归而得到一个异常而不是一条清晰的错误消息,那么您应该报告一个bug。这就是我所期望的。不,我使用的是4.0,但可能会用4.1验证问题。啊,刚刚发现,我使用的是4.1。我应该更好地使用4.0吗?