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



我有一个语法(antlr4)文件,其中包含lexer和解析器规则。我已经扩展了生成的*BaseListener类并覆盖了

public void visitErrorNode(@NotNull ErrorNode node) {}

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

组合语法:-

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

输入文本:

rating

我得到的实际错误:

no viable alternative at input 'rating'

如果你还没有特伦斯·帕尔的《最终ANTLR 4参考》,你应该从实用书架上找到。它有整整一章提供了大量关于管理解析器错误的详细信息,我可以在这里提供更多信息。(不,无所畏惧的BDFL不会给我任何回扣。)

您得到的错误实际上来自解析器,而不是解析树助行器(它在BaseListener接口上启动)。您需要扩展解析器的BaseErrorListener,以便在错误实际发生时捕获错误。这将在出现错误时为您提供一个解析器实例。如果内存可用,getRuleInvocationStack()将为您提供解析器所期望的符号。

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

更新:解析器方法getExpectedTokens()将为您提供符号转发。

相关内容

  • 没有找到相关文章

最新更新