我正在开发一个clang插件,需要在插件中的某个时刻生成C代码片段的AST。类似于:
std::string c_code = "...";
getAST(c_code);
有人能告诉我如何处理这个问题吗?
我正在开发一个clang插件,需要在插件中的某个时刻生成C代码片段的AST。类似于:
std::string c_code = "...";
getAST(c_code);
有人能告诉我如何处理这个问题吗?
//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_parseTranslationUnit的参数之一是unsaved_files
。因此,你可以提供一个命令行g++ main.cpp
,然后提供一个名为main.cpp
并且内容来自你的字符串的未保存文件。
clang
中使用-dump-ast
吧? - Brian Cain