我想使用访客模式来遍历ParserRuleContext并使用预定义的节点构建AST。

在我的语法中,我有以下规则:

expr
    : loop
    | block


我想产生一个具有以下结构的AST:

    exprNode
      /
loopNode


Antlr生成的BaseVisitor具有以下方法:

public T visitExpr(MyParser.ExprContext ctx) { return visitChildren(ctx); }


ASTBuilder覆盖此方法并创建exprNode。对于此exprNode,我想通过调用我的loopNodeblockNode的替代版本附加visitLoopvisitBlock。我的问题是我不知道expr的身份,因为我只是从父母那里获得了exprContext。如何检查使用了expr规则的哪个调用?

最佳答案

不要覆盖visitExpr。只需覆盖visitLoopvisitBlock

自动生成的visitExpr将调用这两个中的相应一个(通过visitChildren),并返回返回的visitLoopvisitBlock。因此,只要您覆盖这些方法以返回正确的结果,visitExpr还将自动返回正确的结果。

08-19 10:34