使用Clang将关键字添加到Objective-C

Sed*_*ien 7 compiler-construction objective-c llvm clang keyword

我如何使用Clang编译器向Objective-C添加一个相对简单的关键字?例如,添加@yes映射到的文字[NSNumber numberWithBool:YES].

我查看了Clang的(优秀)源代码,并相信我需要做的大部分工作都在lib/Rewrite/RewriteObjC.cpp.有一种方法RewriteObjC::RewriteObjCStringLiteral(参见上一个链接),它为文字NSString *实例执行类似的工作.

我问这个问题,因为Clang是非常模块化的,我不确定哪个.td(参见tablegen)文件,.h文件和AST访问者通行证我需要修改以实现我的目标.

Jos*_*sen 1

如果我正确理解 clang 的代码(我仍在学习,所以要小心),我认为这种类型添加的起点将在 clang/lib/Parse/ParseObjc.cpp 内的 Parser::ParseObjCAtExpression 中。

需要注意的一件事是,Parser 类在多个文件中实现(似乎由输入语言分隔),但完全在 clang/include/Parser.h 中声明。

解析器有许多遵循 ParseObjCAt 模式的方法,例如 ParseObjCAtExpression ParseObjCAtStatement ParseObjCAtDirectives 等。

具体来说,ParseObjc.cpp 的第 1779 行似乎是解析器检测到@“foo”形式的 Objective-C 字符串文字的地方。但是,它还调用了我还不完全理解的 ParsePostfixExpressionSuffix 。我还没有弄清楚它如何知道解析字符串文字(例如,相对于 @synchronize)。

ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {
...
        return ParsePostfixExpressionSuffix(ParseObjCStringLiteral(AtLoc));
...
}
Run Code Online (Sandbox Code Playgroud)

如果您还没有,请访问 clang 的“入门”页面开始编译。