Как пройти лягушку AST вручную?
Я могу пройтись по конкретным поддеревьям Clang AST, используя класс recursivevisitor, но я хочу пройтись по узлу Clang AST за узлом.
Буду очень признателен, если кто-нибудь сможет мне помочь с этим.
Заранее спасибо.
1 ответ
RecursiveASTVisitor может делать то, что вам нужно.
Реализация методов-членов 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;
}
};