使用Clang获取C代码片段的AST?

3

我正在开发一个clang插件,需要在插件中的某个时刻生成C代码片段的AST。类似于:

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

有人能告诉我如何处理这个问题吗?


你肯定不想只是从命令行的clang中使用-dump-ast吧? - Brian Cain
我正在尝试在clang插件中完成这个任务。我从另一个工具导入了一段C代码片段,并希望在插件中提取其AST,以便将其添加到原始的C代码中。 - Saswat Padhi
@SaswatPahdi,我猜我的答案没起作用? - Ishamael
谢谢Ishamael。你的回答确实有帮助。我仍在努力理解一些部分。 顺便说一下,我没有对你的回答进行负面评价。 - Saswat Padhi
2个回答

1
也许有几种方法可以实现这个,但最终我找到了以下代码片段,并且对我来说看起来足够简单:
//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();

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


-1

我没有一个准备好直接复制粘贴的代码片段,但是我之前使用的思路是这样的:

请注意clang_parseTranslationUnit的参数之一是unsaved_files。因此,你可以提供一个命令行g++ main.cpp,然后提供一个名为main.cpp并且内容来自你的字符串的未保存文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接