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

时间:2014-10-08 14:16:15

标签: java validation antlr4

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

我已尝试this以及a custom error strategy,但我仍然收到像

这样的消息
  

第1行:2代码识别错误:'x'

控制台上的

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

2 个答案:

答案 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并且您不关心解析器可以解决的某些词法错误,这是一个很好的解决方案。