Потребитель ClangAST: Как пройти операторы, VarDecl, BinaryOperator внутри FunctionDecl? - PullRequest
0 голосов
/ 11 июня 2019

Внутри Clang AST у меня есть ходок для FunctionDecl. Как пройти через DeclStmt, Statements, BinaryOperator внутри объявлений функций. Пожалуйста, предложите с примером.

1 Ответ

0 голосов
/ 11 июня 2019

Это не так много информации в вопросе. Это было бы более понятно на примере того, чего вы хотите достичь с помощью этого типа обхода. Итак, имея столько информации, я могу предложить здесь только самое общее решение.

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!

...