在Java和ANTLRWorks调试器中捕获ANTLR的NoViableAltException

时间:2013-03-13 12:02:55

标签: java antlr

考虑我们尝试将一些不正确的输入文本提供给某些语法(例如包含一些未知标记的文本)。在解释过程中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 ',')。但是如果使用未知令牌进行不可行输入,解析器只会在顶级children == null对象中生成CommonTree,而不会报告任何错误。

我正在使用antlr 3.5

问题:是否有可能在生成的Java代码中描述所描述的情况NoViableAltException以及如何捕获?{/ p>

2 个答案:

答案 0 :(得分:1)

好的,this answer 280Z28给我的second part of this question解决了这两个问题。所以,这是正确的答案。

答案 1 :(得分:0)

您需要在词法分析器中添加以下 last last 规则。它将为无效字符创建一个令牌,并将其发送到正确报告错误的解析器。

ANYCHAR : . ;