Я должен получить все структуры и типы, определенные в проекте (как описано в моем предыдущем вопросе «https://stackoverflow.com/questions/23154414/c-project-get-all-global-variables-and-all-types«)
Я выбрал решение Clang, потому что, похоже, это мой единственный способ …
Тем не менее, единственный «хороший» учебник, который я нашел, это: http://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-i-introduction/ и есть еще некоторые вопросы:
1) Обрабатываются ли директивы препроцессора (#include, #define и т. Д.)
2) Как получить тип и член структуры?
на самом деле, для этого * простого * кода, например:
typedef struct
{
int i;
char i2;
} S1;
typedef struct S2
{
int i;
struct S2 s2;
} S2;
typedef S3 struct S3;
struct S3
{
int i;
char i2;
}
S1 m_s1;
S2 m_s2;
struct S3 m_s3;
какой метод из clang::RecursiveASTVisitor
класс (http://clang.llvm.org/doxygen/classclang_1_1RecursiveASTVisitor.html) называются и в каком порядке? (и не могли бы вы дать мне объяснения о том, как получить нужные мне данные?)
Ладно, как советовал Мат Петерссон, я экспериментировал.
1) Да, AST генерируется после препроцессора. Это позволяет получить всю информацию.
2) Обход AST в первую очередь на глубину. Вместо того, чтобы реализовать VisitFoo(Foo *)
методы, вы можете переопределить TraverseFoo(Foo *)
метод, чтобы получить начало и конец каждого узла поиска:
class YourVisitor : public RecursiveASTVisitor<YourVisitor>
{
//...
virtual bool TraverseFoo(Foo * f)
{
//Some stuff to do before to explore the children
bool r = RecursiveASTVisitor<YourVisitor>::TraverseFoo(f);
//Some stuff to do after
return r
}
}
Затем, чтобы получить структуры (= записи) и их члены, просто повторно реализовать TraverseRecordDecl для обработки структуры и VisitFieldDecl для получения полей.