如何在 ANTLR 4 解析器规则中获取上下文/行号?

How to get context / line number in ANTLR 4 parser rule?

以这条规则/catch为例:

section : (title sstart row+ send);

    catch[Exception e] {System.out.println("Notification: Problem on line " + *line # here*); System.exit(0);}

如何获取引发错误的令牌的行号?

当您查看放置异常块的生成代码时,您会发现它是用于解析 section 规则的方法的一部分,可能类似于:

public final SectionContext section() throws RecognitionException {
    SectionContext _localctx = new SectionContext(_ctx, getState());
    ...
}

如您所见,为此规则创建了一个解析上下文 (_localctx),它将获取所有子上下文以及对构成此规则的第一个和最后一个标记的引用(请参阅 ParserRuleContext.startParserRuleContext.stop。这是您可以从中获取源信息的地方。

可能是此 SectionContext 实例在发生异常时尚未完成。在这种情况下,您可以改用父上下文(SectionContext 创建调用中的 _ctx 参数)。

如果你有一个 ParserRuleContext ctx,你可以知道该行是:

ctx.start.getLine()

你可以知道行中的位置:

ctx.start.getCharPositionInLine()