2014-12-05 44 views
3

我正在使用clang進行一些分析,我需要在AST中查找聲明的父級。例如,在下面的代碼我有int x,我想它的父應該是函數聲明:在Clang中查找聲明的父級AST

int main(int x) { return 0 }

我知道在這個環節http://comments.gmane.org/gmane.comp.compilers.clang.devel/2152提到有一個ParentMap類跟蹤父節點。但是,這隻代表Stmt * - > Stmt *的地圖,我需要找到聲明的父項。有誰知道我該怎麼做?

回答

3

正如ParentMap正如您正在尋找的鏈接線程中所述。在鐺具體的聲明均來自clang::Decl提供

virtual Stmt* getBody() const; 

另外,您也可能會高興與ready-made AST matchers這使創建查詢的AST更容易承受。叮叮整理檢查大量使用它們,並且很容易遵循,請參閱源[git]

2

可以使用AstContext :: getParents()找到一個AST節點的父 示例代碼是這樣的:

const Stmt* ST = str; 

    while (true) { 
     //get parents 
     const auto& parents = pContext->getParents(*ST); 
     if (parents.empty()) { 
      llvm::errs() << "Can not find parent\n"; 
      return false; 
     } 
     llvm::errs() << "find parent size=" << parents.size() << "\n"; 
     ST = parents[0].get<Stmt>(); 
     if (!ST) 
      return false; 
     ST->dump(); 
     if (isa<CompoundStmt>(ST)) 
      break; 
    } 

的AstContext :: getParents()可以接收語句的參數或DECL參數。