使用 Clang 获取 C 片段的 AST?
Get AST for C fragment, using Clang?
我正在构建一个 clang 插件,我正在尝试在插件中的某个位置为 C 片段生成 AST。类似于:
std::string c_code = "...";
getAST(c_code);
谁能指点我,怎么做?
我没有准备好复制粘贴的代码,但我之前使用的想法如下:
请注意 clang_parseTranslationUnit 将 unsaved_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();
欢迎提供更简单的替代方案或改进建议。
我正在构建一个 clang 插件,我正在尝试在插件中的某个位置为 C 片段生成 AST。类似于:
std::string c_code = "...";
getAST(c_code);
谁能指点我,怎么做?
我没有准备好复制粘贴的代码,但我之前使用的想法如下:
请注意 clang_parseTranslationUnit 将 unsaved_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();
欢迎提供更简单的替代方案或改进建议。