Добавить ключевое слово в Objective-C, используя Clang - PullRequest
7 голосов
/ 03 февраля 2012

Как мне добавить относительно тривиальное ключевое слово в Objective-C с помощью компилятора Clang? Например, добавление литерала @yes, который отображается на [NSNumber numberWithBool:YES].

Я посмотрел (превосходный) исходный код для Clang и считаю, что большая часть работы, которую мне нужно было бы сделать, заключается в lib/Rewrite/RewriteObjC.cpp. Существует метод RewriteObjC::RewriteObjCStringLiteral (см. Предыдущую ссылку), который выполняет аналогичную работу для буквальных NSString * экземпляров.

Я задаю этот вопрос, так как Clang очень модульный, и я не уверен, какие .td (см. tablegen) файлы, .h файлы и проходы посетителя AST мне нужно изменить достичь моей цели.

1 Ответ

1 голос
/ 03 февраля 2012

Если я правильно понимаю код clang (я все еще учусь, поэтому будьте осторожны), я думаю, что отправной точкой для этого типа добавления будет Parser :: ParseObjCAtExpression в clang / lib / Parse / ParseObjc.cpp.

Следует отметить, что класс Parser реализован в нескольких файлах (казалось бы, разделенных языком ввода), но полностью объявлен в clang / include / Parser.h.

Parser имеет многометоды, следующие шаблону ParseObjCAt, например ParseObjCAtExpression ParseObjCAtStatement ParseObjCAtDirectives и т. д.

В частности, строка 1779 ParseObjc.cpp выглядит там, где анализатор обнаруживает строковый литерал Objective-C в виде @ ",Тем не менее, он также вызывает ParsePostfixExpressionSuffix, который я до конца не понимаю.Я не понял, как он может анализировать строковый литерал (например, вместо @synchronize).

ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {
...
        return ParsePostfixExpressionSuffix(ParseObjCStringLiteral(AtLoc));
...
}

Если вы этого еще не сделали, посетите clang "Getting Started" страница для начала компиляции.

...