【问题标题】:Antlr4 generated java code visitor pattern confusionAntlr4生成java代码访问者模式混淆
【发布时间】:2022-10-14 23:55:36
【问题描述】:

当 antlr 为访问者模式生成 java 代码时,我们得到了一个访问者基类。

public class YxBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements YxVisitor<T> {
    /**
     * {@inheritDoc}
     *
     * <p>The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.</p>
     */
    @Override public T visitProgram(YxParser.ProgramContext ctx) { return visitChildren(ctx); }
}

我有一个来自YxBaseVisitor 的名为ASTBuilder 的派生类。所以当我需要使用ASTBuilder访问ParseTree节点时,我会调用函数

            ParseTree parseTreeRoot = parser.program();
            ASTBuilder astBuilder = new ASTBuilder(gScope);
            ASTRoot = (RootNode)astBuilder.visit(parseTreeRoot);

这段代码调用了ASTBuildervisit方法,但是ASTBuilder没有定义visit方法,而是继承自AbstractParseTreeVisitorvisit,这也是antlr生成的。

但是,visit 是用return null; 定义的,我没有找到其他覆盖访问来分发不同类型的ParseTree 节点。

访问模式是如何工作的?

【问题讨论】:

    标签: java antlr4 visitor-pattern


    【解决方案1】:

    它继承了AbstractParseTreeVisitor的访问,AbstractParseTreeVisitor也是由antlr生成的。

    AbstractParseTreeVisitor 不会生成,它是运行时的一部分。 YxVisitorYxBaseVisitor 是正在生成的。

    但是,visit 是用return null; 定义的

    我不确定你是如何得出这个结论的,但这不是真的。它实际上被定义为return tree.accept(this); (source)。

    现在,这里调用的accept 方法将在每个生成的树类中被覆盖,以调用YxVisitor 中相应的visitFoo 方法,例如ProgramContext.accept 将被覆盖以调用 YxVisitor.visitProgram(this),这就是您的 visitProgram 方法最终被调用的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多