如何为具有特殊文件结尾的文件扩展Clang附加解析器,即我可以开发一个FrontendAction
,说“嘿!我将处理文件结尾的所有文件”。 '并返回一个抽象语法树(clang::ASTContext
?)“?
我已经阅读了clang::FrontendAction
,clang::Parser
和clang::driver::Driver
,但我无法弄清楚我应该在何处以及如何扩展Clang以便能够扩展编译器另一个解析器(不扩展当前的解析器)。
答案 0 :(得分:1)
以下是一些提示:
<{1>}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添加额外的解析器会有很多麻烦。虽然一切都是模块化的,但仍需要做很多工作来创建并将所有内容联系在一起。如果您的语言扩展了ObjC,只需使用现有的解析器。如果你的语言完全不同,那么clang对你来说可能不是一个好选择。