使用 Clang 获取 C 片段的 AST?

Get AST for C fragment, using Clang?

我正在构建一个 clang 插件,我正在尝试在插件中的某个位置为 C 片段生成 AST。类似于:

std::string c_code = "...";
getAST(c_code);

谁能指点我,怎么做?

我没有准备好复制粘贴的代码,但我之前使用的想法如下:

请注意 clang_parseTranslationUnitunsaved_files 作为参数之一。因此,我们的想法是提供命令行 g++ main.cpp,然后提供名称为 main.cpp 的未保存文件和字符串中的内容。

可能有几种方法可以实现这一点,但最终我得到了以下代码片段,对我来说它看起来很简单:

//arguments to the compiler
std::unique_ptr <std::vector<const char*>> args(new std::vector<const char*>());
args->push_back("my_file.c");

//do the magic
ASTUnit *au = ASTUnit::LoadFromCommandLine(
  &(*args)[0],
  &(*args)[0] + args->size(),
  IntrusiveRefCntPtr<DiagnosticsEngine>(
    CompilerInstance::createDiagnostics(new DiagnosticOptions)),
  StringRef()
);

//get the translation unit node
Declr *d = au->getASTContext().getTranslationUnitDecl();

欢迎提供更简单的替代方案或改进建议。