我想使用访客模式来遍历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
规则的哪个调用?
答案 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
)并返回返回的visitExpr
或visitChildren
。因此,只要您覆盖这些方法以返回正确的结果,visitLoop
也会自动返回正确的结果。
答案 1 :(得分:0)
标记规则替代项可为确定身份提供方便的上下文:
expr
: loop #loopExpr
| block #blockExpr
;
现在,生成的解析器将包含LoopExprContext extends ExprContext
和BlockExprContext extends ExprContext
类,这些类具有适当的访问者进入和退出方法。