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

ANTLR4:获取给定输入的下一个可能匹配的解析器规则,antlr4,Antlr4,我有一个语法(antlr4)文件,其中包含lexer和parser规则。我已经扩展了生成的*BaseListener类并重写了 public void visitErrorNode(@NotNull ErrorNode node) {} 方法。在方法体中,我试图获取下一个可能的解析器规则(在本例中,我需要知道'op'是预期作为给定输入的下一个规则的规则)visitErrorNode是获取此信息或任何其他方式以获取所需信息的正确方法 组合语法:- ratingCriteria :

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

public void visitErrorNode(@NotNull ErrorNode node) {}
方法。在方法体中,我试图获取下一个可能的解析器规则(在本例中,我需要知道'op'是预期作为给定输入的下一个规则的规则)
visitErrorNode
是获取此信息或任何其他方式以获取所需信息的正确方法

组合语法:-

ratingCriteria        :   'rating' op NUMBER
op: '>' | '>=' | '<' ;
我得到的实际错误:

no viable alternative at input 'rating'
如果你还没有特伦斯·帕尔的“最终ANTLR 4参考”,你应该从他的网站上获得。它有一整章,提供了大量关于管理解析器错误的详细信息——我可以在这里提供更多信息。(而且,不,无所畏惧的BDFL不会给我任何回扣。)

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

   List<String> stack = ((Parser)recognizer).getRuleInvocationStack();
   Collections.reverse(stack);
List stack=((解析器)识别器).getRuleInvocationStack();
集合。反向(堆栈);

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

谢谢,我随身带着这本书。getExpectedTokens()为我提供了“rating”的替代标记,而不是“rating”之后的下一个预期标记。在这里,我希望这些标记中的任何一个'>'|'>='|'
   List<String> stack = ((Parser)recognizer).getRuleInvocationStack();
   Collections.reverse(stack);