使用ANTLR4,可以生成可以被覆盖的基本访问者和侦听器。显然,我需要使用它们来实现类型检查和执行。
在ANTLR4 visitor pattern on simple arithmetic example中,可以看到以下示例访问者类:
public class EvalVisitor extends ExpressionsBaseVisitor<Integer> {
@Override
public Integer visitOpExpr(@NotNull ExpressionsParser.OpExprContext ctx) {
int left = visit(ctx.left);
int right = visit(ctx.right);
String op = ctx.op.getText();
switch (op.charAt(0)) {
case '*': return left * right;
case '/': return left / right;
case '+': return left + right;
case '-': return left - right;
default: throw new IllegalArgumentException("Unknown operator " + op);
}
}
@Override
public Integer visitStart(@NotNull ExpressionsParser.StartContext ctx) {
return this.visit(ctx.expr());
}
@Override
public Integer visitAtomExpr(@NotNull ExpressionsParser.AtomExprContext ctx) {
return Integer.valueOf(ctx.getText());
}
@Override
public Integer visitParenExpr(@NotNull ExpressionsParser.ParenExprContext ctx) {
return this.visit(ctx.expr());
}
// ...
}
换句话说,我想用每个访问者方法的实现来实现我的自定义访问者。 但是据我所知,ANTLR3不会生成这样的代码,而且,我很难遵循C目标。我正在显示一个访客示例,但是如果我可以在C目标中使用侦听器模式,那么它也很重要。