如何手动遍历clang AST?

时间:2015-06-12 14:30:44

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:16)

RecursiveASTVisitor可以满足您的需求。

为您的RecursiveASTVisitor`派生类(例如MyClass)实现member methods 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;
    }
};