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

时间:2018-02-12 03:56:17

标签: antlr4

以此规则/捕获为例:

section : (title sstart row+ send);

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

我怎样才能获得引发错误的令牌的行号?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

如果您有一个ParserRuleContext ctx,您可以将该行知道为:

ctx.start.getLine()

你可以知道这个位置:

ctx.start.getCharPositionInLine()