假如有一种场景,我们已经获得了语法树的节点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));
}