在Clang AST中查找声明的父级

时间:2014-12-05 04:17:19

标签: c++ clang abstract-syntax-tree

我使用clang进行一些分析,我需要在AST中找到声明的父级。例如,在下面的代码中我有int x,我想得到它应该是函数声明的父代:

int main(int x) { return 0 }

我知道如此链接http://comments.gmane.org/gmane.comp.compilers.clang.devel/2152中提到的,有一个ParentMap类来跟踪父节点。但是,这仅代表Stmt * - >的地图。 Stmt *和我需要找到声明的父级。有谁知道我怎么能做到这一点?

3 个答案:

答案 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中没有此方法。