在Java和ANTLRWorks调试器中捕获ANTLR的NoViableAltException
考虑我们尝试将一些不正确的输入文本提供给某些语法(例如包含一些未知标记的文本)。 在ANTLRWorks
期间的ANTLRWorks
中,我们将在图中看到NoViableAltException
。
UPD:出现此exception有两种情况:
1)意外使用了一些已知的令牌,在这种情况下,我们将收到类似于line 5:36 no viable alternative at input ','
2)使用未知令牌类型。 例如,语法对于以@
符号开头的标记一无所知。 我们正试图用这样的标记为我们的语法提供文本。
不幸的是, 在情况(2)中,在ANTLRWorks
调试器中既没有抛出此exception ,也没有在生成的Java代码中抛出exception ; 但只有在ANTLRWorks
解释器的结果图中ANTLRWorks
看到它。
我也尝试将以下标准代码添加到我的语法中:
@parser::members { private IErrorReporter errorReporter = null; public void setErrorReporter(IErrorReporter errorReporter) { this.errorReporter = errorReporter; } public void emitErrorMessage(String msg) { errorReporter.reportError(msg); } } @lexer::members { ... the same code as above ... }
这种结构成功地捕获了类型(1)的解析错误(例如,关于令牌的意外使用的错误: line 5:36 no viable alternative at input ','
)。 但是如果使用未知令牌的不可行输入,解析器只会在顶级CommonTree
对象中生成children == null
,而不会报告任何错误。
我正在使用antlr 3.5
。
问题:是否有可能在生成的Java代码中描述的情况下捕获NoViableAltException
以及如何?
那么, 280Z28给出的这个问题的第二部分 答案 很好地解决了这两个问题。 所以,这是正确的答案。
您需要添加以下内容作为词法分析器中的最后一条规则。 它将为无效字符创建一个令牌,并将其发送到正确报告错误的解析器。
ANYCHAR : . ;