【发布时间】:2013-03-13 21:37:49
【问题描述】:
考虑我们尝试将一些不正确的输入文本提供给某些语法(例如,包含一些未知标记的文本)。在ANTLRWorks 在解释过程中我们会在图中看到NoViableAltException。
UPD:出现此异常有两种情况:
1) 意外使用了一些已知令牌,在这种情况下,我们将收到类似line 5:36 no viable alternative at input ','
2) 使用未知令牌类型。例如,语法对以@ 符号开头的标记一无所知。我们正在尝试将带有此类标记的文本提供给我们的语法。
不幸的是,如果 (2) 没有抛出此异常,ANTLRWorks 调试器和生成的 Java 代码中都没有;但它只在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 以及如何捕获?
【问题讨论】: