我正在使用 ANTLR 解析我正在编写的 Java 工具中的逻辑表达式,我遇到了问题,因为将无效的输入字符串传递给生成的 ANTLR 词法分析器和解析器不会导致任何异常。生成的文件并没有像我期望的那样抛出 RecognitionException,而是将错误消息打印到控制台并返回,就好像没有发生错误一样,导致我的程序稍后在遇到空数据时崩溃。
我使用 ANTLRWorks 1.4.3 版来生成文件,似乎应该有某种选项让它实际抛出错误而不是打印到控制台,但我没有找到任何东西。有谁知道如何让 ANTLR 实际抛出错误消息?我看到 C# 中的同样问题是通过使用旧版本的 ANTLR 解决的,这是我需要做的吗?
编辑:在巴特指出我要找的方向后,我找到了这个页面
https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3
其“错误处理”部分的代码可以更准确地完成我想要的。要改变 ANTLR 捕获异常的方式,你可以在语法文件中这样说:
@rulecatch {
catch (RecognitionException e) {
throw e;
}
}
这迫使 ANTLR 抛出异常而不是处理和恢复。该部分还有一些关于覆盖不匹配和恢复函数以确保抛出所有可能的异常的内容。