确定字符串是否符合ANTLR4语法



如何根据语法测试字符串,看看它是否有效(即没有发现错误,也没有必要进行错误恢复)?

我已经尝试过这个以及自定义错误策略,但我仍然收到像这样的消息

行1:2 处的令牌识别错误

在控制台上。因此,我需要一种方法来确保所有错误都会导致异常,或者一种不依赖于异常来验证输入的方法。

编辑:您看到的是lexer错误,而不是解析器错误。您需要通过添加以下内容作为lexer的最后一条规则来更新lexer,以确保lexer不能够匹配输入字符。这将把错误字符传递给解析器进行处理(报告、恢复等)
ERR_CHAR : . ;

除此之外,您还需要执行以下通用步骤,这些步骤适用于为简单的字符串识别配置解析器。


你需要做两件事才能正常工作:

首先,禁用默认的错误报告机制。

parser.removeErrorListeners();

其次,禁用默认的错误恢复机制。

parser.setErrorStrategy(new BailErrorStrategy());

如果字符串不匹配,您将得到一个ParseCancellationException,而不会得到其他报告。

如果您不使用解析操作的输出,您可能还希望通过禁用解析树构造来提高识别过程的效率。

parser.setBuildParseTree(false);

一个快速而肮脏的解决方案。。。

Parser p = new MyParser(myTokenStream);
p.rootRule();
if (p.getNumberOfSyntaxErrors() > 0) {
    throw new RuntimeException("Syntax error!");
}

如果存在不会导致解析器混淆的词法错误(例如,无关输入),这对您没有帮助,因为语法错误的数量仍然为零。

如果您不想摆弄ErrorListeners,也不关心解析器可以绕过的某些lexer错误,那么这是一个很好的解决方案。

相关内容

  • 没有找到相关文章

最新更新