繁体   English   中英

如何在Antlr中使用访问者创建自定义AST

[英]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我要追加无论是loopNodeblockNode致电我压倒版本visitLoopvisitBlock 我遇到的问题是我不知道expr的身份,因为我仅从父级获得了exprContext 如何检查使用了哪个expr规则调用?

不要覆盖visitExpr 只需覆盖visitLoopvisitBlock

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

标记规则替代项可为确定身份提供方便的上下文:

expr
    : loop   #loopExpr
    | block  #blockExpr
    ;

现在,生成的解析器将包含LoopExprContext extends ExprContextBlockExprContext extends ExprContext类, BlockExprContext extends ExprContext类具有行为正常的访客enter和exit方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM