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