Это не так много информации в вопросе. Это было бы более понятно на примере того, чего вы хотите достичь с помощью этого типа обхода. Итак, имея столько информации, я могу предложить здесь только самое общее решение.
Clang предлагает несколько классов для посетителей и путешественников AST. Посетители являются типичными представителями шаблона , в то время как traversers являются посетителями, которые также проходят через дочерние элементы каждого узла. Основным traverser является RecursiveASTVisitor . Вы можете прочитать об этом в руководстве или в документации .
Вот пример:
class Traverser : public RecursiveASTVisitor<Traverser> {
public:
bool VisitFunctionDecl(FunctionDecl *D) {
D->dump();
return true;
}
bool VisitDeclStmt(DeclStmt *DS) {
DS->dump();
return true;
}
bool VisitBinaryOperator(BinaryOperator *BO) {
BO->dump();
return true;
}
};
Это решение будет посещать ЛЮБЫЕ объявления функций, операторы объявлений и двоичные выражения. Если вам нужен более настроенный подход, вы можете настроить обход, переопределив методы Traverse * и так далее. Если это не так, вы всегда можете реализовать свой собственный traverser , используя StmtVisitor , DeclVisitor , TypeVisitor и TypeLocVisitor .
Я надеюсь, что эта информация полезна и будет полезна для вас. Счастливого взлома с Clang!