2

考虑我们尝试将一些不正确的输入文本提供给一些语法(例如,包含一些未知标记的文本)。在ANTLRWorks解释过程中,我们将NoViableAltException在图中看到。

UPD:出现此异常有两种情况:

1) 意外使用了一些已知令牌,在这种情况下,我们将收到类似line 5:36 no viable alternative at input ','

2) 使用未知的令牌类型。例如,语法对以符号开头的标记一无所知@。我们正在尝试将带有此类标记的文本提供给我们的语法。

不幸的是,在情况 (2)中,调试器和生成的 Java 代码都没有抛出这个异常;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 ','。但是如果输入不可行且带有未知标记,解析器只会children == null在顶部CommonTree对象中生成,而不会报告任何错误。

我正在使用antlr 3.5.

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

4

2 回答 2

2

好吧,280Z28对我这个问题的第二部分给出的这个答案很好地解决了这两个问题。所以,这是正确的答案。

于 2013-03-13T13:37:49.777 回答
0

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

ANYCHAR : . ;
于 2013-03-13T13:15:39.107 回答