我想使用访客模式来遍历ParserRuleContext并使用预定义的节点构建AST。
在我的语法中,我有以下规则:
expr
: loop
| block
我想产生一个具有以下结构的AST:
exprNode
/
loopNode
Antlr生成的
BaseVisitor
具有以下方法:public T visitExpr(MyParser.ExprContext ctx) { return visitChildren(ctx); }
ASTBuilder
覆盖此方法并创建exprNode
。对于此exprNode
,我想通过调用我的loopNode
和blockNode
的替代版本附加visitLoop
或visitBlock
。我的问题是我不知道expr
的身份,因为我只是从父母那里获得了exprContext
。如何检查使用了expr
规则的哪个调用? 最佳答案
不要覆盖visitExpr
。只需覆盖visitLoop
和visitBlock
。
自动生成的visitExpr
将调用这两个中的相应一个(通过visitChildren
),并返回返回的visitLoop
或visitBlock
。因此,只要您覆盖这些方法以返回正确的结果,visitExpr
还将自动返回正确的结果。