【问题标题】:Objective-C header parsingObjective-C 头文件解析
【发布时间】:2013-07-11 01:00:24
【问题描述】:

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

  • 我尝试过使用Doxygen 并解析XML 输出,但它不完全支持没有cmets 的Objective C 标头(它会阻塞属性中定义的宏,请检查Doxygen not properly recognizing properties
  • 我也尝试过使用appledoc,但是XML输出不够完整(例如,没有类的继承信息),属性上的宏也有同样的问题。
  • 我还尝试解析库 Objective C 元数据的输出(使用 otool),但注意到元数据不会保留方法上的类型(因此您会得到 method:(id)param:(id)

有人知道做我想做的事的好工具吗?我怀疑 clang 会帮助我,但到目前为止,-ast-dump 和类似选项只是试图为我没有的源生成 AST(只有标题)。

【问题讨论】:

    标签: objective-c parsing clang


    【解决方案1】:

    您也许可以使用 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'
    [...]
    

    【讨论】:

    • 就是这样。我不知道为什么这以前不起作用,但我现在开始起作用了。我现在遇到的一个问题是某些导入不起作用(像#import &lt;Foundation/Foundation.h&gt; 这样的东西,但正如你所说,我必须将参数传递给驱动程序)
    【解决方案2】:

    我认为使用 clang 听起来太难了。我只会使用正则表达式。

    相反,我会围绕 Doxygen 编写一个简单的 shell 脚本包装器,以解决有问题的语法。

    改起来应该很简单:

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

    收件人:

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

    您甚至可以将 NS_DEPRECATED() 之类的内容转换为 @deprecated 评论。

    【讨论】:

    • 不,由于此答案中引用的所有原因,正则表达式无济于事:stackoverflow.com/questions/1732348/…
    • @bbum 我不会单独使用正则表达式,我会混合使用正则表达式和其他一些脚本语言。我有多年使用正则表达式解析编程语言的经验,可以做到,而且在这种情况下很容易。
    • 我保证,对于您要应用的正则表达式 + 脚本语言的每种组合,我都可以找到一个完全有效的 ObjC 语法位,它会破坏它,直到您最终重新发明整个符合标准编译器... ;)
    • @bbum 它不需要涵盖所有 ObjC 的语法,只需要涵盖头文件和 doxygen 无法处理的特定部分。根据问题,只有 5 或 6 个编译器宏会导致问题。这没什么大不了的。
    • 在另一件事绊倒之前,这不是一件大事。去过也做过。变成了 Krazy Kode(我帮助维护了一堆可怕的正则表达式,它们解析系统头文件以生成 PyObjC 和其他桥使用的语言桥元数据)。现在使用 clang,好多了——好多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多