我使用clang进行一些分析,我需要在AST中找到声明的父级。例如,在下面的代码中我有int x
,我想得到它应该是函数声明的父代:
int main(int x) { return 0 }
我知道如此链接http://comments.gmane.org/gmane.comp.compilers.clang.devel/2152中提到的,有一个ParentMap类来跟踪父节点。但是,这仅代表Stmt * - >的地图。 Stmt *和我需要找到声明的父级。有谁知道我怎么能做到这一点?
答案 0 :(得分:3)
正如您正在寻找的链接线程中描述的那样ParentMap
。在clang特定声明中,所有声明都继承自提供
clang::Decl
virtual Stmt* getBody() const;
或者您可能对ready-made AST matchers感到满意,这使得在AST上创建查询变得更加容易。铿锵有力的检查大量使用它们并且非常容易理解,请参阅来源[git]。
答案 1 :(得分:3)
您可以使用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()可以接收stmt参数或decl参数。
答案 2 :(得分:0)
关于FunctionDecl的父级,有一些注意事项:Function的声明可能是类的成员,或者可能是“独立的”声明。
如果FunctionDecl是类的成员,则FunctionDecl是CXXMethodDecl,因此您可以使用以下方法进行检查:
isa<CXXMethodDecl>(FunctionDecl *FD).
然后,您可以使用getParent()方法获取CXXMethodDecl的父级。 FunctionDecl中没有此方法。