2012-02-03 11 views
7

Jak mam postąpić w związku z dodaniem stosunkowo trywialnego słowa kluczowego do Objective-C za pomocą kompilatora Clang? Na przykład dodanie literału @yes, który jest mapowany na [NSNumber numberWithBool:YES].Dodaj słowo kluczowe do Objective-C za pomocą Clang

Przyjrzałem się (znakomitemu) kodowi źródłowemu dla Clanga i wierzę, że większość pracy, którą powinienem wykonać, to lib/Rewrite/RewriteObjC.cpp. Istnieje metoda RewriteObjC::RewriteObjCStringLiteral (zobacz poprzedni link), która wykonuje podobne zadanie dla literalnych instancji NSString *.

pytam jak Clang to pytanie jest bardzo modularny i nie jestem pewien, który .td (patrz tablegen) plików, .h plików i AST użytkownik przechodzi musiałbym modyfikować, aby osiągnąć swój cel.

+0

Dlaczego chcesz to zrobić? Chcesz, aby Twój kod był kompilowany tylko przez ulepszony kompilator? – Krizz

+4

@Krizz Aby dowiedzieć się więcej o wewnętrznych działaniach Clanga, oto dlaczego! To ćwiczenie edukacyjne :) –

+0

Jeśli chcesz tylko @yes bez nurkowania w tych wewnętrznych elementów Clang, zobacz: http://stackoverflow.com/a/17837531/598057 –

Odpowiedz

1

Jeśli dobrze rozumiem kod klanu (wciąż się uczę, więc zachowaj ostrożność), myślę, że punktem wyjścia dla tego typu dodawania będzie Parser :: ParseObjCAtExpression wewnątrz clang/lib/Parse/ParseObjc.cpp .

Należy zwrócić uwagę na to, że klasa Parser jest zaimplementowana w kilku plikach (pozornie oddzielonych przez język wprowadzania), ale jest zadeklarowana w całości w clang/include/Parser.h.

Parser ma wiele metod Wzorem ParseObjCAt, np ParseObjCAtExpression ParseObjCAtStatement ParseObjCAtDirectives itp ..

szczególności, wiersz 1779 z ParseObjc.cpp pojawia się, gdy analizator wykrywa ciąg celu C dosłowne w formie @ "foo". Jednak wywołuje również ParsePostfixExpressionSuffix, którego jeszcze nie w pełni rozumiem. Nie zorientowałem się, jak to możliwe, aby parsować literał łańcuchowy (na przykład w przypadku @synchronizacji).

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

Jeśli jeszcze nie, wizyta dzyń za "Getting Started" strona zacząć z kompilacji.