[英]How to create a custom AST using visitor in Antlr
我想使用访客模式来遍历ParserRuleContext并使用预定义的节点构建AST。
在我的语法中,我有以下规则:
expr
: loop
| block
我想产生一个具有以下结构的AST:
exprNode
/
loopNode
BaseVisitor
生成的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
也会自动返回正确的结果。
标记规则替代项可为确定身份提供方便的上下文:
expr
: loop #loopExpr
| block #blockExpr
;
现在,生成的解析器将包含LoopExprContext extends ExprContext
和BlockExprContext extends ExprContext
类, BlockExprContext extends ExprContext
类具有行为正常的访客enter和exit方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.