Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用libclang/libtooling_C++_C_Abstract Syntax Tree_Libclang - Fatal编程技术网

C++ 使用libclang/libtooling

C++ 使用libclang/libtooling,c++,c,abstract-syntax-tree,libclang,C++,C,Abstract Syntax Tree,Libclang,我必须检索项目中定义的所有结构和类型,如前一个问题所述 我选择了叮当声解决方案,因为这似乎是我唯一的方法。。。 然而,我发现的唯一好的教程是:还有一些问题: 1是否处理预处理器指令,包括、定义等 2如何检索类型和结构成员 实际上,对于这个简单的代码,例如: typedef struct { int i; char i2; } S1; typedef struct S2 { int i; struct S2 s2; } S2; typedef S3 struct S3

我必须检索项目中定义的所有结构和类型,如前一个问题所述

我选择了叮当声解决方案,因为这似乎是我唯一的方法。。。 然而,我发现的唯一好的教程是:还有一些问题:

1是否处理预处理器指令,包括、定义等

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派生类中的哪个方法,并按其顺序调用?你能给我解释一下如何检索我需要的数据吗?

好的,正如马特·彼得森所建议的,我进行了实验

1是的,AST是在预处理器之后生成的。它允许检索所有信息

2 AST遍历是深度优先的。您可以重新实现TraverseFooo*方法以获得每个节点查找的开始和结束,而不是实现VisitFooo*方法:

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
   }
}

然后要获取structs=记录及其成员,只需重新实现TraverseRecordDecl来处理struct,并访问FieldDecl来获取字段。

好的,正如Mat Peterson所建议的,我进行了实验

1是的,AST是在预处理器之后生成的。它允许检索所有信息

2 AST遍历是深度优先的。您可以重新实现TraverseFooo*方法以获得每个节点查找的开始和结束,而不是实现VisitFooo*方法:

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
   }
}

然后,要获取structs=记录及其成员,只需重新实现TraverseRecordDecl来处理struct,并访问FieldDecl来获取字段。

当然,您的两个问题都可以通过一些实验来回答。链接中的详细描述似乎很好地解释了发生的情况。如果你不理解抽象语法树是如何工作的,那么也许你应该仔细阅读这个主题。当然,你的两个问题都可以通过一些实验来回答。链接中的详细描述似乎很好地解释了发生的情况。如果您不理解抽象语法树是如何工作的,那么也许您应该仔细阅读这个主题。