神秘的ANTLR错误

时间:2012-02-23 04:01:20

标签: java eclipse antlr

我所知道的是,它正在停止生产,我道歉。这是日志文件:

(10): internal error: /Bridge/bridge.g : java.lang.IllegalStateException: java.lang.NullPointerException 
 org.deved.antlride.runtime.AntlrErrorListener$DynamicToken.invokeMethod(AntlrErrorListener.java:59) 
 org.deved.antlride.runtime.AntlrErrorListener$DynamicToken.getLine(AntlrErrorListener.java:64) 
 org.deved.antlride.runtime.AntlrErrorListener.report(AntlrErrorListener.java:131) 
 org.deved.antlride.runtime.AntlrErrorListener.message(AntlrErrorListener.java:115) 
 org.deved.antlride.runtime.AntlrErrorListener.warning(AntlrErrorListener.java:99) 
 org.antlr.tool.ErrorManager.grammarWarning(ErrorManager.java:742) 
 org.antlr.tool.ErrorManager.grammarWarning(ErrorManager.java:757) org.antlr.tool.Grammar.parseAndBuildAST(Grammar.java:655) 
 org.antlr.Tool.getRootGrammar(Tool.java:626) org.antlr.Tool.process(Tool.java:459) 
 org.deved.antlride.runtime.Tool2.main(Tool2.java:24)

2 个答案:

答案 0 :(得分:4)

我用逻辑公式的简单语法得到了同样的错误。对我来说问题是,ANTLR无法找到明显的启动规则,因为我对预期的启动规则进行了递归。添加指向递归的新规则就完成了工作(参见http://thesoftwarelife.blogspot.com/2008/07/antlr-frustrations.html)。

很遗憾,ANTLR IDE无法正确转发错误消息。在命令行上我得到:

  

警告(138):Formula.g:0:1:语法公式:没有开始规则(EOF显然不能遵循规则)

答案 1 :(得分:0)

昨天我遇到了同样的问题。不确定我的情况是否与您的相同,但值得一试。我有一个名为注释的规则:

annotation
    : AT class declaration?
        -> ^(ANNOTATION class declaration?)
    ;

我想用花括号解析子注释,所以我做了:

subAnnotation:
    : CURLY_START annotation CURLY_END
       -> ^(ANNOTATION annotation)
    ;

这给了我同样的错误。所以,我最终想知道它不起作用。即使我不确定,我认为问题是导致错误的注释规则的递归。所以,我最终这样做了:

annotationValue:
    : CURLY_START subAnnotation CURLY_END
       -> ^(ANNOTATION subAnnotation)
    ;

subAnnotation
    : AT class declaration?
       -> ^(ANNOTATION class declaration?)
    ;

这解决了我的问题。就像我说的,我不知道这个修复是否适用于你的问题。而且,我认为ANTLR能够处理非左递归规则。也许对该工具有更好了解的人可以证实这一点。

我必须承认我没有尝试@BartKiers的建议,也许它也可以解决问题。

的问候,
马特