如何根据我的语法测试字符串,看它是否有效(即没有发现错误,并且不需要进行错误恢复)?
我已尝试this以及a custom error strategy,但我仍然收到像
这样的消息控制台上的第1行:2代码识别错误:'x'
。所以我需要一种方法来确保所有错误导致异常,或者一种方法来验证不依赖于异常的输入。
答案 0 :(得分:5)
编辑:您看到的是词法分析器错误,而不是解析器错误。您需要更新词法分析器以确保词法分析器无法未能匹配输入字符,方法是添加以下内容作为词法分析器的最后一个规则。这会将错误的字符传递给解析器进行处理(报告,恢复等)。
ERR_CHAR : . ;
除此之外,您还需要执行以下常规步骤,这些步骤适用于配置解析器以进行简单的字符串识别。
您需要做两件事才能使其正常工作:
首先,禁用默认的错误报告机制。
parser.removeErrorListeners();
其次,禁用默认错误恢复机制。
parser.setErrorStrategy(new BailErrorStrategy());
如果您的字符串不匹配,您将获得ParseCancellationException
,而不会收到其他报告。
如果您没有使用解析操作的输出,您可能还希望通过禁用解析树构造来提高识别过程的效率。
parser.setBuildParseTree(false);
答案 1 :(得分:1)
快速而肮脏的解决方案......
Parser p = new MyParser(myTokenStream);
p.rootRule();
if (p.getNumberOfSyntaxErrors() > 0) {
throw new RuntimeException("Syntax error!");
}
如果存在不会导致解析器混淆的词汇错误(例如无关输入),这将无法帮助您,因为语法错误的数量仍为零。
如果您不想使用ErrorListener并且您不关心解析器可以解决的某些词法错误,这是一个很好的解决方案。