我正在使用ANTLR在我正在编写的Java工具中解析逻辑表达式,并且遇到了问题,因为将无效的输入字符串传递给生成的ANTLR词法分析器和解析器不会引起任何异常。生成的文件没有像我期望的那样抛出RecognitionException,而只是将错误消息打印到控制台并像没有发生错误一样返回,从而导致我的程序稍后运行到空数据时崩溃。
我使用ANTLRWorks版本1.4.3生成文件,似乎应该有某种选择使它实际上引发错误而不是打印到控制台,但是我什么都没找到。有谁知道如何让ANTLR实际抛出错误消息?我发现使用较旧版本的ANTLR解决了C#中的同一问题,这是我需要做的吗?
编辑:在巴特指出我在寻找的方向后,我找到了此页面
https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3
其“错误处理”部分的代码可以完全满足我的要求。要更改ANTLR捕获异常的方式,可以在语法文件中这样说:
@rulecatch { catch (RecognitionException e) { throw e; } }
这迫使ANTLR抛出异常,而不是对其进行处理和恢复。该部分还包含一些有关覆盖不匹配和恢复功能的内容,以确保抛出所有可能的异常。
一个简单的解决方法是覆盖您的词法分析器和解析器reportError(...)并抛出您自己的异常,而不是让ANTLR尝试从错误的语法/输入中恢复:
reportError(...)
grammar YourGrammar; // options/header/tokens @parser::members { @Override public void reportError(RecognitionException e) { throw new RuntimeException("I quit!\n" + e.getMessage()); } } @lexer::members { @Override public void reportError(RecognitionException e) { throw new RuntimeException("I quit!\n" + e.getMessage()); } } // lexer & parser rules
有关错误报告(和恢复)的更多信息:https : //theantlrguy.atlassian.net/wiki/display/ANTLR3/Error+reporting+and+recovery