1

我必须检索项目中定义的所有结构和类型(如我之前的问题中所述“ 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 )中的什么方法被调用并按顺序调用?(你能给我解释一下如何检索我需要的数据吗?)

4

1 回答 1

4

好的,正如 Mat Petersson 建议的那样,我进行了实验。

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 来获取字段。

于 2014-04-25T07:36:58.127 回答