在Clang中查找声明的父级AST

问题描述:

我正在使用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 *的地图,我需要找到声明的父项。有谁知道我该怎么做?

正如ParentMap正如您正在寻找的链接线程中所述。在铛具体的声明均来自clang::Decl提供

virtual Stmt* getBody() const; 

另外,您也可能会高兴与ready-made AST matchers这使创建查询的AST更容易承受。叮叮整理检查大量使用它们,并且很容易遵循,请参阅源[git]

可以使用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参数。