2013-07-11 15 views
6

Potrzebuję wykonać parsowanie niektórych nagłówków Objective-C.Parsowanie nagłówka obiektu Objective-C

  • Próbowałem za pomocą Doxygen i analizowania danych wyjściowych XML, ale nie w pełni obsługuje nagłówki Objective C bez uwag (to dławiki na makr określonych właściwości, sprawdź Doxygen not properly recognizing properties)
  • Próbowałem zostały również przy użyciu appledoc, ale wynik XML nie jest wystarczająco kompletny (na przykład nie ma informacji o dziedziczeniu dla klas) i ma ten sam problem z makrami na właściwościach.
  • Ja również próbowałem parsowania wyjście z biblioteki Cel metadanych C (przy użyciu otool), ale zauważyłem, że metadane nie przechowuje typy dotyczące metod (aby uzyskać method:(id)param:(id))

Czy ktoś wie dobre narzędzie do robienia tego, co chcę? Podejrzewam, że pomoże mi clang, ale jak dotąd -ast-dump i podobne opcje po prostu próbują wygenerować AST dla źródła, którego nie mam (tylko nagłówki).

Odpowiedz

15

Możesz używać libclang. libclang to programowy interfejs przeznaczony do implementacji narzędzi takich jak podświetlanie składni i uzupełnianie kodu.

clang -ast-dump dla mnie. (Zauważ, że -ast-dump nie jest obsługiwany przez kierowcę, więc trzeba zrobić kilka dodatkowych prac przekazać flagi że kierowca zwykle uchwytów. Można użyć clang -### ... zobaczyć dokładnie to, co kierowca robi.)

% clang -cc1 -ast-dump -fblocks -x objective-c /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h 
[...] 
|-ObjCInterfaceDecl 0x1023727c0 <line:50:1, line:96:2> NSObject 
| |-ObjCProtocol 0x102371350 'NSObject' 
[...] 
+1

To było to. Nie wiem, dlaczego to nie działało wcześniej, ale teraz działa.Jednym z problemów, które mam teraz, jest to, że niektóre produkty nie działają (np. '#import ', ale jak powiedziałeś, będę musiał przekazać parametry do sterownika) –

-4

Myślę, że używanie dźwięków klangowych jest zbyt trudne. Po prostu używałbym RegEx.

Zamiast tego chciałbym napisać prostą wrappera skryptu powłoki wokół Doxygen, który komentuje problematyczną składnię.

Powinno być dość proste, aby zmienić:

@property(nonatomic, retain) BOOL myProperty NS_AVAILABLE_IOS(3_2); 

Do:

@property(nonatomic, retain) BOOL myProperty /*NS_AVAILABLE_IOS(3_2)*/; 

Można nawet konwertować rzeczy jak NS_DEPRECATED() do @deprecated komentarza.

+2

Nie , wyrażeń regularnych nie pomoże z wszystkich powodów wymienionych w tej odpowiedzi: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – bbum

+0

@bbum I wouldn sam wykonam regex, zrobię hybrydę regex i kilku innych języków skryptowych. Mam wieloletnie doświadczenie w analizie języków programowania z regex, można to zrobić i jest to łatwe w tym przypadku. –

+2

Gwarantuję, że każda kombinacja języka regex + skryptowego, który miałbyś zastosować, mogłaby znaleźć całkowicie poprawną składnię ObjC, która by ją złamała, aż w końcu wymyśliłbyś cały kompilator zgodny ze standardami ...;) – bbum