2016-07-13 76 views
0

我需要遍歷匹配的AST節點的所有祖先或後代,以便稍後使用該信息使輸入源代碼的某些部分變得輕鬆。 我試圖尋找方法來做到這一點。我查看了ASTContext類的getParents成員函數。我可以使用它來升級AST層次結構來訪問我當前匹配節點的所有祖先節點。但問題是,當我得到父節點時,我不再有該節點的上下文來嘗試獲取它的父節點。我可以嘗試爲新節點重建ASTContext,但如果可能的話,這似乎是另一項重大任務。 我正在尋找的最低NodeKind(C層中最低)是callExpr,我要找的最高的是functionDecl。 如何在匹配返回控制runMatchCallback後獲得匹配AST節點的所有祖先或後代?獲取匹配節點的所有祖先或後代

回答

0

可能會繼續以遞歸方式訪問父聲明,直到達到TranslationUnitDecl,但是,我會建議實際迭代TranslateUnitDecl中的聲明並改爲使用FunctionDecl。

您可以創建一個遞歸函數,它可以找到翻譯單元中的所有TagDecl,在您指定的FunctionDecl中搜索該類中的所有方法,並且還遞歸使用該TagDecl中的TagDecls,直到您沒有剩下任何東西消耗。

這樣可以讓您更輕鬆地保存所需的特定AST節點的完整記錄,並且可能不會令人困惑地編寫。

但是,如果你選擇工作方式落後,你可以嘗試這樣的事情(未經測試)

FunctionDecl *FD; 
DeclContext *PC = FD->getParent(); 
while (!isa<TranslationUnitDecl>(Decl::castFromDeclContext(PC))) { 
    //consume 

    PC = PC->getParent(); 
} 

的後代(兒童),你只需要轉型爲兒童和迭代類型。

相關問題