如何手动遍历clang AST? [英] How to traverse clang AST manually ?

查看:983
本文介绍了如何手动遍历clang AST?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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





提前感谢。

解决方案



实施成员方法 TraverseDecl(Decl * x) TraverseStmt(Stmt * x) code> TraverseType(QualType x)为您的RecursiveASTVisitor的派生类(例如MyClass)将做的伎俩。组合,这三个方法将带您到AST中的每个节点。



示例:

  class MyClass:public RecursiveASTVisitor< MyClass> {
public:
bool TraverseDecl(Decl * D){
//这里的逻辑
RecursiveASTVisitor< MyClass> :: TraverseDecl(D); // Forward to base class
return true; //返回false以停止AST分析
}
bool TraverseStmt(Stmt * x){
//您的逻辑在这里
RecursiveASTVisitor< MyClass> :: TraverseStmt(x);
return true;
}
bool TraverseType(QualType x){
//这里的逻辑
RecursiveASTVisitor< MyClass> :: TraverseType(x);
return true;
}
};


I can traverse the specific subtrees of clang AST using the recursivevisitor class but what I want to do is to traverse the clang AST node by node.

I'd be really grateful if anybody can help me with this.

Thanks in advance.

解决方案

RecursiveASTVisitor can do what you need.

Implementing the member methods TraverseDecl(Decl *x), TraverseStmt(Stmt *x) and TraverseType(QualType x) for your RecursiveASTVisitor`-derived class (e.g. MyClass) will do the trick. Combined, those three methods will take you to each and every node in your AST.

Example:

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;
    }
};

这篇关于如何手动遍历clang AST?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆