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

Li *_*ong 1 antlr4

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

顺便说一句,当前节点也可能被新节点替换.

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

Sam*_*ell 5

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

a的子ParserRuleContext元素是ParserRuleContext或者的实例TerminalNode,并且它们的最常见的接口是ParseTree.