Clang 使用叮当声获取AST

Clang 使用叮当声获取AST,clang,abstract-syntax-tree,Clang,Abstract Syntax Tree,我想使用Clang访问它的AST,以获得关于特定源文件中的变量和方法的一些信息。但是,我不想使用LibTooling工具。我想手工编写代码,调用方法解析.cpp,然后获取树。我找不到任何资源可以告诉我如何做到这一点。有人能帮忙吗?如果您的目标是学习如何驱动Clang组件使用编译数据库、配置编译器实例等等,那么Clang源代码就是一种资源。也许ClangTool::buildASTs方法的源代码是一个很好的起点:请参阅源代码树的lib/Tooling/目录中的Tooling.cpp 如果您的目标是

我想使用Clang访问它的AST,以获得关于特定源文件中的变量和方法的一些信息。但是,我不想使用LibTooling工具。我想手工编写代码,调用方法解析.cpp,然后获取树。我找不到任何资源可以告诉我如何做到这一点。有人能帮忙吗?

如果您的目标是学习如何驱动Clang组件使用编译数据库、配置编译器实例等等,那么Clang源代码就是一种资源。也许ClangTool::buildASTs方法的源代码是一个很好的起点:请参阅源代码树的lib/Tooling/目录中的Tooling.cpp

如果您的目标是执行LibTooling不支持的分析,并且您只想以最小的麻烦获得AST,那么ClangTool::buildASTs或clang::tooling::buildASTFromCode都可能有用。如果您需要编译数据库来表示编译器选项、包含路径等,那么ClangTool方法会更好。如果您有用于轻量级测试的独立代码,那么buildASTFromCode就可以了。下面是ClangTool方法的一个示例:

#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
#include "llvm/Support/CommandLine.h"
#include <memory>
#include <vector>

static llvm::cl::OptionCategory MyOpts("Ignored");

int main(int argc, const char ** argv)
{
  using namespace clang;
  using namespace clang::tooling;
  CommonOptionsParser opt_prs(argc, argv, MyOpts);
  ClangTool tool(opt_prs.getCompilations(), opt_prs.getSourcePathList());
  using ast_vec_t = std::vector<std::unique_ptr<ASTUnit>>;
  ast_vec_t asts;
  tool.buildASTs(asts); 
  // now you the AST for each translation unit
  ...

我还没有弄明白的是,例如,如何在单个AST单元上运行MatchFinder。我找到的每个教程都将简单地使用tool.runfrontendFactory之类的工具。您能详细介绍一下如何使用这些单个AST单元实例吗?
#include "clang/Frontend/ASTUnit.h"
#include "clang/Tooling/Tooling.h" 

  ...
  std::string code = "struct A{public: int i;}; void f(A & a}{}";   
  std::unique_ptr<clang::ASTUnit> ast(clang::tooling::buildASTFromCode(code));
  // now you have the AST for the code snippet
  clang::ASTContext * pctx = &(ast->getASTContext());
  clang::TranslationUnitDecl * decl = pctx->getTranslationUnitDecl();
  ...