如何使用额外的解析器扩展Clang?

时间:2012-12-26 16:06:48

标签: c++ compiler-construction llvm clang

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

我已经阅读了clang::FrontendActionclang::Parserclang::driver::Driver,但我无法弄清楚我应该在何处以及如何扩展Clang以便能够扩展编译器另一个解析器(扩展当前的解析器)。

1 个答案:

答案 0 :(得分: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添加额外的解析器会有很多麻烦。虽然一切都是模块化的,但仍需要做很多工作来创建并将所有内容联系在一起。如果您的语言扩展了ObjC,只需使用现有的解析器。如果你的语言完全不同,那么clang对你来说可能不是一个好选择。