fin*_*son 11 c++ compiler-construction llvm clang
我如何使用额外的解析器扩展Clang以获取具有特殊文件结尾的文件,即我可以开发一个FrontendAction说"嘿!我将处理文件结尾为'.lorem'的所有文件并返回抽象语法树(clang::ASTContext?)"?
我读过有关clang::FrontendAction,clang::Parser而clang::driver::Driver但我一直无法弄清楚在何处以及如何我应该延伸到锵能够与一个额外的解析器(扩展编译器不能扩展当前解析器).
以下是一些提示:
在tools/clang/lib/Driver/Types.cpp你有lookupTypeForExtension,它根据扩展名确定编译代码的“类型”。例如,对于.m扩展名,它返回TY_ObjC. 您还可以使用isObjC谓词来确定给定类型是否属于 Objective C。
至于解析器如何知道它正在解析哪种语言......它通过 知道它Preprocessor,它有一个LangOptions成员。后者有许多在 中定义的选项include/clang/Basic/LangOptions.def。例如,ObjC1和ObjC2。这些设置在 中CompilerInvocation::setLangDefaults,最终从 中调用CompilerInvocation::CreateFromArgs。
请记住,clang 驱动程序将调用 clang 前端作为“子进程”,并向其传递附加命令行参数。该驱动程序与 gcc 兼容,前端可以看作 clang 本身。
另外,恕我直言,为 clang 添加额外的解析器会很麻烦。虽然一切都是模块化的,但需要完成大量工作来创建并将所有内容连接在一起。如果您的语言扩展了 ObjC,则只需使用现有的解析器。如果您的语言完全不同,那么 clang 对您来说可能不是一个好的选择。