有没有办法使用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()
答案 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/