如何根据语法测试字符串,看看它是否有效(即没有发现错误,也没有必要进行错误恢复)?
我已经尝试过这个以及自定义错误策略,但我仍然收到像这样的消息
行1:2 处的令牌识别错误
在控制台上。因此,我需要一种方法来确保所有错误都会导致异常,或者一种不依赖于异常来验证输入的方法。
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错误,那么这是一个很好的解决方案。