Exemplo visitor

Uma primeira versão (limpa) de um visitor pode ser gerada com o script antlr4-visitor

Depois podemos alterá-la, por exemplo, da seguinte forma:

import org.antlr4.runtime.tree.AbstractParseTreeVisitor;

public class ShapesMyVisitor extends ShapesBaseVisitor<Object> {
    @Override
    public Object visitDistance(ShapesParser.DistanceContext ctx){
        double res;
        double[] p1 = (double[])visit(ctx.point(0));
        double[] p2 = (double[])visit(ctx.point(1));
        res = Math.sqrt(Math.pow(p1[0]-p2[0].2) + Math.pow(p1[1]-p2[1].2));
        System.out.println("visitDistance: "+res);
        return res;
    }
    @Override
    public Object visitPoint(ShapesParser.PointContext ctx){
        double[] res = new double[2];
        res[0] = Double.parseDouble(ctx.x.getText());
        res[1] = Double.parseDouble(ctx.y.getText());
        return (Object)res;
    } 
}

Para utilizar esta classe:

public static void main(String[] args){
    ...
    // visitor:
    ShapesMyVisitor visitor = new ShapesMyVisitor();
    System.out.println("distance: "+visitor.visit(tree));
    ...
}

O comando antlr4-main permite a geração automática deste código no método main.antlr4-main <Grammar> <start-rule> -v <nome-da-classe-ou-fich-visitor> ...

Note que podemos criar o método main com os listeners e visitors que quisermos (a ordem especificada nos argumentos do comando é mantida).

Last updated