在ANTLR解析树中存储行号

时间:2018-04-03 12:38:44

标签: antlr antlr4 antlr3

有没有办法使用ANTLR 4在创建的解析树中存储行号?我看到了这篇文章:http://puredanger.github.io/tech.puredanger.com/2007/02/01/recovering-line-and-column-numbers-in-your-antlr-ast/,它可以做到这一点,但我认为它适用于较旧的ANTLR版本,因为

  

parser.setASTFactory(工厂);

似乎不适用于ANTLR 4。 我想的是像

这样的东西
  

treenode.getLine()

,就像我们可以拥有

一样
  

treenode.getChild()

1 个答案:

答案 0 :(得分:1)

使用Antlr4,您通常可以实现侦听器或访问者。

两者都为您提供了一个上下文,您可以在其中找到令牌的位置。

例如(使用访问者),我想保留由大写标识符(我的标记定义中的UCASE_ID)定义的赋值的位置。

你感兴趣的是......

ctx.UCASE_ID().getSymbol().getLine()

访客看起来像......

static class TypeAssignmentVisitor extends ASNBaseVisitor<TypeAssignment> {
    @Override
    public TypeAssignment visitTypeAssignment(TypeAssignmentContext ctx) {
        String reference = ctx.UCASE_ID().getText();
        int line = ctx.UCASE_ID().getSymbol().getLine();
        int column = ctx.UCASE_ID().getSymbol().getCharPositionInLine()+1;

        Type type = ctx.type().accept(new TypeVisitor());
        TypeAssignment typeAssignment = new TypeAssignment();
        typeAssignment.setReference(reference);
        typeAssignment.setReferenceToken(new Token(ctx.UCASE_ID().getSymbol().getLine(), ctx.UCASE_ID().getSymbol().getCharPositionInLine()+1));
        typeAssignment.setType(type);
        return typeAssignment;
    }
}

我是Antlr4的新手,发现这对于开始使用听众和访客非常有用...... https://github.com/JakubDziworski/AntlrListenerVisitorComparison/