我想将新节点插入到我的解析器访问树时获得的解析树中。该位置可能是当前节点的父节点或兄弟节点,也可能就在它之前,因此我需要通过在{中调用getParent
和getChild
方法来检查是否存在与新节点的规则名称匹配的节点{1}}。 ParseRuleContext
会返回getParent
,但ParseRuleContext
会返回getChild
。为什么这两种方法会返回不同的类型?
BTW,当前节点也可能被新节点替换。
在解析树上实现这种修改的最佳方法是什么?谢谢!
答案 0 :(得分:5)
ANTLR 4中的解析树由终端节点和规则节点组成。由于终端节点(代表单个令牌)不能包含任何子节点,因此我们知道任何RuleNode
的父节点也是RuleNode
。 ParserRuleContext
是RuleNode
的特定实现,并且使用表示规则节点的ParserRuleContext
构造的解析树仅将该表示用于规则节点,因此ParserRuleContext
的父级必须也是ParserRuleContext
。
ParserRuleContext
的子项是ParserRuleContext
或TerminalNode
的实例,其中派生的最常见接口是ParseTree
。