Как пройти лягушку 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;
    }
};
Другие вопросы по тегам