2013-07-11 4 views
6

일부 Objective-C 헤더를 구문 분석해야합니다.Objective-C 헤더 구문 분석

  • 내가 Doxygen를 사용하고 XML 출력을 구문 분석을 시도했지만, 완전히 나는 또한 시도했다
  • (Doxygen not properly recognizing properties을 확인,이 속성에 정의 된 매크로에 초크) 설명없이 목적 C 헤더를 지원하지 않습니다 appledoc을 사용하지만 XML 출력이 충분히 완전하지 않거나 (예 : 클래스에 대한 상속 정보가 없음) 속성에 대한 매크로와 동일한 문제가 있습니다.
  • 는 또한 (otool 사용) 라이브러리 목표 C 메타 데이터의 출력을 구문 분석하려고했으나 메타 데이터 방법에 대한 유형을 (그래서 당신은 method:(id)param:(id)를 얻을)

사람이 알고 있나요 유지하지 않는 것으로 나타났습니다 내가 원하는 걸 할 수있는 좋은 도구? 나는 clang이 나를 도울 것으로 의심하지만, 지금까지 -ast-dump 및 유사한 옵션은 소스 (단지 헤더)가없는 AST를 생성하려고 시도합니다.

답변

15

libclang을 사용할 수 있습니다. libclang은 구문 강조 및 코드 완성과 같은 도구를 구현하기 위해 설계된 프로그래밍 방식의 인터페이스입니다.

clang -ast-dump이 맞습니다. (-ast-dump이 드라이버에서 지원되지 않습니다, 그래서 당신은 드라이버가 보통. 당신은 드라이버가 일을 정확히 볼 수 clang -### ...를 사용하여 처리하는 플래그를 전달하기 위해 몇 가지 추가 작업을해야합니다.)

% 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

이것은 그 것이다. 왜 이것이 이전에 작동하지 않았는지 모르겠지만 지금은 작동하게되었습니다.필자가 지금 가지고있는 한 가지 문제점은 일부 import가 작동하지 않는다는 것입니다 ('#import '와 같은 것입니다,하지만 당신이 말했듯이, 나는 매개 변수를 드라이버에 전달해야 할 것입니다) –

-4

나는 clang 소리를 사용하는 것이 너무 어렵다고 생각합니다. RegEx 만 사용합니다.

대신 Doxygen을 둘러싼 간단한 쉘 스크립트 래퍼를 작성하여 문제가있는 구문을 주석 처리합니다.

는 변경 아주 간단해야한다 :

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

사람 :

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

당신은 심지어 @deprecated 코멘트에 NS_DEPRECATED() 등을 변환 할 수 있습니다.

+2

없음 정규 표현식은이 답변에 인용 된 모든 이유에 도움이되지 않습니다. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – bbum

+0

@bbum I wouldn regex를 혼자서하지 말고, 정규 표현식과 다른 스크립팅 언어의 하이브리드를 할 것입니다. 정규식으로 프로그래밍 언어를 파싱하는 데 수년간의 경험이 있습니다.이 작업은 쉽게 완료 할 수 있으며이 경우 쉽습니다. –

+2

정규식 + 스크립팅 언어의 모든 조합에 대해 보증합니다. 전체 표준 호환 컴파일러를 다시 발명하게 될 때까지는 깨뜨릴 수있는 ObjC 구문의 완벽하게 유효한 비트를 찾을 수 있습니다.;) – bbum

관련 문제