繁体   English   中英

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

[英]Determining whether string complies with ANTLR4 grammar

如何根据我的语法测试一个字符串,看它是否有效(即没有发现错误,并且不需要进行错误恢复)?

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

第1:2行令牌识别错误:'x'

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

编辑:您看到的是词法分析器错误,而不是解析器错误。 您需要更新词法分析器以确保词法分析器无法通过添加以下作为词法分析器的最后一个规则来匹配输入字符。 这会将错误的字符传递给解析器进行处理(报告,恢复等)。

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!");
}

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

如果您不想使用ErrorListener并且不关心解析器可以解决的某些词法错误,那么这是一个很好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM