ANTLR4:获取给定输入的下一个可能的匹配解析器规则

时间:2014-08-26 18:29:16

标签: antlr4

我有一个包含词法分析器和解析器规则的语法(antlr4)文件。我已经扩展了生成的*BaseListener类并重写了

public void visitErrorNode(@NotNull ErrorNode node) {}

方法。在方法体内,我试图获得下一个可能的解析器规则(在这种情况下,我需要知道'op'是预期作为给定输入的下一个规则的规则)。 visitErrorNode是获取此信息或以其他方式获取所需信息的正确方法。

组合语法: -

ratingCriteria        :   'rating' op NUMBER
op: '>' | '>=' | '<' ;

输入文字:

rating

我得到的实际错误:

no viable alternative at input 'rating'

1 个答案:

答案 0 :(得分:0)

如果你还没有&#34;最终的ANTLR 4参考&#34;作者:Terence Parr,你应该从The Pragmatic Bookshelf得到它。它有一整章提供了有关管理解析器错误的大量细节 - 更多我可以在这里提供。 (而且,不,无所畏惧的BDFL不会给我任何回扣。)

您获得的错误实际上来自解析器,而不是解析树walker(在BaseListener接口上触发)。您需要扩展解析器BaseErrorListener以在实际发生时捕获错误。这将在错误点为您提供解析器的实例。如果内存服务,getRuleInvocationStack()将为您提供解析器所期望的符号。

   List<String> stack = ((Parser)recognizer).getRuleInvocationStack();
   Collections.reverse(stack);

更新:解析器方法getExpectedTokens()将向前提供符号。