为什么getChild方法在ANTLR4中返回ParseTree而不是ParseRuleContext?

时间:2013-07-12 12:47:33

标签: antlr4

我想将新节点插入到我的解析器访问树时获得的解析树中。该位置可能是当前节点的父节点或兄弟节点,也可能就在它之前,因此我需要通过在{中调用getParentgetChild方法来检查是否存在与新节点的规则名称匹配的节点{1}}。 ParseRuleContext会返回getParent,但ParseRuleContext会返回getChild。为什么这两种方法会返回不同的类型?

BTW,当前节点也可能被新节点替换。

在解析树上实现这种修改的最佳方法是什么?谢谢!

1 个答案:

答案 0 :(得分:5)

ANTLR 4中的解析树由终端节点和规则节点组成。由于终端节点(代表单个令牌)不能包含任何子节点,因此我们知道任何RuleNode的父节点也是RuleNodeParserRuleContextRuleNode的特定实现,并且使用表示规则节点的ParserRuleContext构造的解析树仅将该表示用于规则节点,因此ParserRuleContext的父级必须也是ParserRuleContext

ParserRuleContext的子项是ParserRuleContextTerminalNode的实例,其中派生的最常见接口是ParseTree