【问题标题】:Catching ANTLR's NoViableAltException in Java and ANTLRWorks Debugger在 Java 和 ANTLRWorks 调试器中捕获 ANTLR 的 NoViableAltException
【发布时间】: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 以及如何捕获?

【问题讨论】:

    标签: java antlr


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      ANYCHAR : . ;
      

      【讨论】:

      • 好主意。 但它也没有给我任何结果。不正确的文本没有任何错误。
      • 您确定输入被正确标记(输入中的无效@ 字符是否一直传递到解析器)?您还没有发布语法,因此很难测试您的情况。
      • 我可以确认,添加这样的ANYCHAR lexer 规则并不能解决问题。但是您对我关于OutofmemoryError 的第二个问题的回答很好地解决了这个问题。很明显,这两个问题是交错的。
      • 嗯,我认为这两个问题之间的区别在于解析器在解析带有无效标记的文本时必须“挖掘”的深度。如果它不是很深,那么它将是null 结果。如果太深,则为OutofmemoryError
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多