12

如何为具有特殊文件结尾的文件使用附加解析器扩展 Clang,即我可以开发一个FrontendAction说“嘿!我将处理文件结尾为 '.lorem' 的所有文件并返回一个抽象语法树(clang::ASTContext?)”?

我已经阅读过clang::FrontendAction,但是我无法弄清楚我应该在哪里以及如何扩展 Clang 以便能够使用额外的解析器来扩展编译器(clang::Parser不是扩展当前的解析器)。clang::driver::Driver

4

1 回答 1

1

这里有一些提示:

tools/clang/lib/Driver/Types.cpp你有lookupTypeForExtension,它根据扩展名确定编译代码的“类型”。例如,对于.m它返回的扩展名TY_ObjC。您还拥有isObjC确定给定类型是否属于 Objective C 的谓词。

至于解析器如何知道它正在解析哪种语言......它通过 知道它Preprocessor,它有一个LangOptions成员。后者在 中定义了许多选项include/clang/Basic/LangOptions.def。例如,ObjC1ObjC2。这些设置在 中CompilerInvocation::setLangDefaults,最终从 中调用CompilerInvocation::CreateFromArgs

请记住,clang 驱动程序会将 clang 前端作为“子进程”调用,并向其传递额外的命令行参数。驱动是gcc兼容的,前端可以看成clang本身。

此外,恕我直言,向clang添加额外的解析器会很麻烦。虽然一切都是模块化的,但需要做很多工作来创建并将一切联系在一起。如果您的语言扩展了 ObjC,只需使用现有的解析器。如果您的语言完全不同,那么 clang 可能不是您的好选择。

于 2013-01-06T14:01:58.097 回答