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

时间:2019-02-10 03:24:47

标签: java parsing antlr antlr4 abstract-syntax-tree

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

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

expr
    : loop
    | block

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

    exprNode
      / 
loopNode

Antlr生成的BaseVisitor中包含以下方法:

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

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

2 个答案:

答案 0 :(得分:1)

请勿覆盖b.specificity.specificity。只需覆盖SELECT ((CASE WHEN b.sensitivity> a.sensitivity THEN b.sensitivity ELSE a.sensitivity END) * abs(b.specificity - a.specificity) + (abs(b.sensitivity - a.sensitivity) * abs(b.specificity - a.specificity) / 2 ) ) AS area INTO #Areas FROM #SensSpec a inner join #SensSpec b ON b.rnum - 1 = a.rnum; visitExpr

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

答案 1 :(得分:0)

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

expr
    : loop   #loopExpr
    | block  #blockExpr
    ;

现在,生成的解析器将包含LoopExprContext extends ExprContextBlockExprContext extends ExprContext类,这些类具有适当的访问者进入和退出方法。