我正在使用clang进行一些分析,我需要在AST中找到声明的父级。例如,在下面的代码中,我有int x,我想获取其父对象,该父对象应该是函数声明:
int main(int x) { return 0 }
我知道正如在链接http://comments.gmane.org/gmane.comp.compilers.clang.devel/2152中提到的那样,有一个ParentMap类来跟踪父节点。但是,这仅代表了Stmt *-> Stmt *的映射,我需要找到声明的父级。有人知道我该怎么做吗?

最佳答案

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

关于c++ - 在Clang AST中查找声明的父级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27308691/

10-10 10:34