【发布时间】:2019-02-10 03:24:47
【问题描述】:
我想使用访问者模式遍历 ParserRuleContext 并使用预定义的节点构建 AST。
在我的语法中,我有以下规则:
expr
: loop
| block
我想生成一个具有以下结构的 AST:
exprNode
/
loopNode
Antlr 生成的BaseVisitor 里面有如下方法:
public T visitExpr(MyParser.ExprContext ctx) { return visitChildren(ctx); }
ASTBuilder 覆盖此方法并创建一个exprNode。对于这个exprNode,我想通过调用visitLoop 和visitBlock 的覆盖版本来附加loopNode 或blockNode。我遇到的问题是我不知道expr 的身份,因为我只从父母那里获得了exprContext。如何检查使用了哪个 expr 规则调用?
【问题讨论】:
-
当您说您想将
LoopNode或BlockNode附加到ExprNode时是什么意思?这些类究竟是如何相互关联的,在这种情况下“附加”是什么意思?通常我会假设BlockNode和LoopNode只是抽象类ExprNode的子类,而您希望visitExpr返回其中之一——不要在任何东西上附加任何东西。 -
这或多或少是我想做的。抱歉解释模糊。我将如何决定
visitExpr将返回两个具体节点(BlockNode或LoopNode)中的哪一个?
标签: java parsing antlr antlr4 abstract-syntax-tree