[clang llvm语法树分析] 遍历某stmt下的所有子节点

王锐
发布于 2024-09-30 / 52 阅读
0
0

[clang llvm语法树分析] 遍历某stmt下的所有子节点

假如有一种场景,我们已经获得了语法树的节点Stmt,如何遍历这个节点下的所有子节点呢?

例如,我们通过clang的API获得了某个函数的Stmt,此时可以用RecursiveASTVisitor类的方法构造一个递归访问内访问这个函数的结构体,具体函数如下:

// 自定义AST访问器,用于递归遍历语句(Stmt)
class StmtVisitor : public RecursiveASTVisitor<StmtVisitor> {
public:
    // 处理每个语句
    bool VisitStmt(Stmt *S) {
        if (isa<ReturnStmt>(S)) { // 筛选返回语句
            llvm::outs() << "Found return statement\n";
        } 
        // 可以添加其他筛选方法
        return true;
    }
};

// 函数传参为const FunctionDecl *
int FindStmtIn(const FunctionDecl *FD)
{
    const Stmt *Body = FD->getBody();
    // 使用StmtVisitor递归遍历函数体中的所有语句
    StmtVisitor Visitor;
    Visitor.TraverseStmt(const_cast<Stmt *>(Body));
}


评论