RajatDevSharma
RajatDevSharma

Reputation: 63

Storing line number in ANTLR Parse Tree

Is there any way of storing line numbers in the created parse tree, using ANTLR 4? I came across this article, which does it but I think it's for older ANTLR version, because

parser.setASTFactory(factory);

It does not seem to be applicable to ANTLR 4. I am thinking of having something like

treenode.getLine()

, like we can have

treenode.getChild()

Upvotes: 2

Views: 964

Answers (1)

YaFred
YaFred

Reputation: 10008

With Antlr4, you normally implement either a listener or a visitor.

Both give you a context where you find the location of the tokens.

For example (with a visitor), I want to keep the location of an assignment defined by a Uppercase identifier (UCASE_ID in my token definition).

The bit you're interested in is ...

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

The visitor looks like ...

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;
    }
}

I was new to Antlr4 and found this useful to get started with listeners and visitors ... https://github.com/JakubDziworski/AntlrListenerVisitorComparison/

Upvotes: 3

Related Questions