Использование libclang / libtooling

Я должен получить все структуры и типы, определенные в проекте (как описано в моем предыдущем вопросе «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

Решение

Ладно, как советовал Мат Петерссон, я экспериментировал.

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 для получения полей.

4

Другие решения


По вопросам рекламы [email protected]