在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参数。