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

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

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

如果有人能帮助我,我将不胜感激。

提前致谢。

最佳答案

RecursiveASTVisitor 可以做你需要的。

实现member methods 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;
    }
};

关于c++ - 如何遍历clang AST的所有节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30805595/

相关文章:

c++ - 派生类的 Push_back shared_ptr

c++ - 如何为模板函数指定可能的数据类型

c++ - 如何为使用Clang LLVM编译的C++代码生成图形代码配置文件报告?

python - 允许调试生成的代码的最佳或正确方法是什么?

ruby - 如何处理树顶左递归

c++ - wxWidgets - 单线程多任务

c++ - 对类型 'const QVariant' 的引用无法绑定(bind)到类型 'void' 的右值

c++ - 模板类中的编译时计数器

c++ - 如何在 clang(或 gcc)中删除 C++ 名称?

c# - 从 Roslyn API 中将代码提取为纯字符串