C++ 如何遍历clang AST的所有节点?

C++ 如何遍历clang AST的所有节点?,c++,clang,abstract-syntax-tree,traversal,C++,Clang,Abstract Syntax Tree,Traversal,我可以使用recursivevisitor类遍历clang AST的特定子树,但我要做的是逐节点遍历clang AST 如果有人能帮我,我会非常感激的 提前感谢。递归访客可以做您需要的事情 为递归AstVisitor派生类(例如MyClass)实现TraverseDecl(Decl*x)、TraverseStmt(Stmt*x)和TraverseType(QualType x)就可以了。这三种方法结合在一起,将把您带到AST中的每个节点 例如: class MyClass : public Re

我可以使用recursivevisitor类遍历clang AST的特定子树,但我要做的是逐节点遍历clang AST

如果有人能帮我,我会非常感激的


提前感谢。

递归访客可以做您需要的事情

为递归AstVisitor派生类(例如MyClass)实现
TraverseDecl(Decl*x)
TraverseStmt(Stmt*x)
TraverseType(QualType x)
就可以了。这三种方法结合在一起,将把您带到AST中的每个节点

例如:

class MyClass : public RecursiveASTVisitor<MyClass> {
public:
    bool TraverseDecl(Decl *D) {
        // your logic here
        RecursiveASTVisitor<MyClass>::TraverseDecl(D); // Forward to base class
        return true; // Return false to stop the AST analyzing
    }
    bool TraverseStmt(Stmt *x) {
        // your logic here
        RecursiveASTVisitor<MyClass>::TraverseStmt(x);
        return true;
    }
    bool TraverseType(QualType x) {
        // your logic here
        RecursiveASTVisitor<MyClass>::TraverseType(x);
        return true;
    }
};
class MyClass:public RecursiveASTVisitor{
公众:
布尔遍历数据中心(Decl*D){
//你的逻辑在这里
RecursiveASTVisitor::TraverseDecl(D);//转发到基类
return true;//返回false停止AST分析
}
布尔遍历测试(Stmt*x){
//你的逻辑在这里
RecursiveASTVisitor::TraverseStmt(x);
返回true;
}
布尔遍历类型(QualType x){
//你的逻辑在这里
RecursiveASTVisitor::TraverseType(x);
返回true;
}
};

RecursiveASTVisitor有什么问题?@m.s.RecursiveASTVisitor没有什么问题,只是它只遍历特定的子树,例如像AST中的所有方法调用集一样,但我想要的是逐个遍历AST的所有节点,提取关于每个节点的一些信息集。这就是为什么我需要一个方法逐节点遍历AST。您可以使用根节点的dump():Context.getTranslationUnitDecl()->dump()。如果这不能满足您的需要,您可以阅读和编辑dump()源代码。这些不也应该实施吗?或者会重复遍历吗?您可以使用任何方法,但通常您可能希望遍历最抽象的类型(Expr、Stmt),例如在IfStmt中,如果您希望有条件地遍历Then/Else部分(而不考虑它们的实际类型)。