如何手动遍历clang AST?

hbn*_*991 12 c++ traversal clang abstract-syntax-tree

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

如果有人能帮助我,我真的很感激.

提前致谢.

ret*_*idi 18

RecursiveASTVisitor可以满足您的需求.

实现成员方法 TraverseDecl(Decl *x),TraverseStmt(Stmt *x)TraverseType(QualType x)为您的RecursiveASTVisitor`派生类(例如MyClass)实现这一目的.合并后,这三种方法将带您进入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;
    }
};
Run Code Online (Sandbox Code Playgroud)