我有一个包含词法分析器和解析器规则的语法(antlr4)文件。我已经扩展了生成的*BaseListener
类并重写了
public void visitErrorNode(@NotNull ErrorNode node) {}
方法。在方法体内,我试图获得下一个可能的解析器规则(在这种情况下,我需要知道'op'是预期作为给定输入的下一个规则的规则)。 visitErrorNode
是获取此信息或以其他方式获取所需信息的正确方法。
组合语法: -
ratingCriteria : 'rating' op NUMBER
op: '>' | '>=' | '<' ;
输入文字:
rating
我得到的实际错误:
no viable alternative at input 'rating'
答案 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()
将向前提供符号。