2013-07-12 79 views
1

我想插入新的節點到解析樹,我的解析器剛剛訪問樹時。該位置可能是當前節點的父節點或兄弟節點,或者剛好在它之前,因此我需要通過調用ParseRuleContext中的getParentgetChild方法來檢查是否存在與新節點的規則名稱相匹配的節點。 getParent返回ParseRuleContext,但getChild返回ParseTree。爲什麼這兩種方法返回不同的類型?爲什麼getChild方法在ANTLR4中返回ParseTree而不是ParseRuleContext?

順便說一句,當前節點也應該由新節點替換。

在分析樹上實現這種修改的最好方法是什麼?謝謝!

回答

5

ANTLR 4中的分析樹由終端節點和規則節點組成。由於終端節點(代表單個令牌)不能有任何子節點,所以我們知道任何RuleNode的父節點也是RuleNodeParserRuleContextRuleNode的特定實施方式,並且使用表示規則節點的ParserRuleContext構建的分析樹僅將規則節點的該表示使用,因此ParserRuleContext的父代也必須是ParserRuleContext

ParserRuleContext的孩子是ParserRuleContextTerminalNode的實例,並且這些最常見的通用接口是ParseTree

+0

感謝您的解釋!所以我需要通過檢查它的實例(使用'instanceof')將這個孩子轉換成'ParserRuleContext'。 –

+0

通常您會使用生成的存取方法。例如,如果你有一個規則'foo:bar;',而不是使用'if(fooContext.getChild(1)instanceof BarContext)',你可以使用'if(fooContext.bar()!= null)'。 –

+0

是的,我在訪問樹時使用它。但在另一種情況下,我需要搜索特定節點以插入另一個新節點。搜索時我不知道這些節點內部是什麼。 –

相關問題