我有一个语法(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()
将为您提供符号转发。