当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); }
}我有一个名为ASTBuilder的派生类,它来自YxBaseVisitor。因此,当我需要使用ASTBuilder访问ParseTree节点时,我将调用函数
ParseTree parseTreeRoot = parser.program();
ASTBuilder astBuilder = new ASTBuilder(gScope);
ASTRoot = (RootNode)astBuilder.visit(parseTreeRoot);这段代码调用了ASTBuilder的ASTBuilder方法,但是ASTBuilder没有定义visit方法,而是从AbstractParseTreeVisitor继承visit,后者也是由antlr生成的。
但是,visit是用return null;定义的,我没有找到其他访问覆盖来分发不同类型的ParseTree节点。
访问模式是如何运作的?
发布于 2022-10-14 15:55:36
它继承了AbstractParseTreeVisitor的访问,这也是由antlr生成的。
AbstractParseTreeVisitor不是生成的,而是运行时库的一部分。YxVisitor和YxBaseVisitor是正在生成的。
但是,
visit是用return null;定义的。
我不知道你是怎么得出这个结论的,但事实并非如此。它实际上被定义为return tree.accept(this); (来源)。
现在,在这里调用的accept方法将在每个生成的树类中被重写,以调用YxVisitor中的相应visitFoo方法,例如,ProgramContext.accept将被重写以调用YxVisitor.visitProgram(this),这就是visitProgram方法被调用的方式。
https://stackoverflow.com/questions/74070378
复制相似问题