2013-07-11 63 views
6

我需要解析一些Objective-C头文件。Objective-C头文件解析

  • 我使用Doxygen和解析XML输出试过,但它并不完全支持Objective C的头,不评论(它闷死在属性中定义的宏,检查Doxygen not properly recognizing properties
  • 我也试过使用appledoc,但是XML输出不够完整(例如,没有类的继承信息),并且它与属性上的宏有相同的问题。
  • 我也试着解析(使用otool)库Objective 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 '的东西,但正如你所说的,我必须将参数传递给驱动程序) –

-4

我觉得用clang听起来太难了。我只会使用RegEx。

相反,我会写一个简单的shell脚本包装器,围绕Doxygen注释出有问题的语法。

它应该是很简单的改变:

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

要:

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

你甚至可以转换之类的东西NS_DEPRECATED()@deprecated评论。

+2

无,正则表达式不会帮助所有在这个答案中引用的原因:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – bbum

+0

@bbum我wouldn单独做正则表达式,我会做一个正则表达式和其他一些脚本语言的混合。我有多年使用正则表达式分析编程语言的经验,可以完成,在这种情况下很容易。 –

+2

我保证每一种正则表达式+脚本语言的组合都可以应用,我可以找到一个完全有效的ObjC语法,它会打破它,直到你最终重新发明整个符合标准的编译器...;) – bbum