Parsekit或我自己解析?

时间:2012-04-18 15:20:06

标签: objective-c cocoa grammar parsekit

我正在编写一个应用程序,我需要解析葡萄酒菜单。从我到目前为止看到的,它们都遵循一些结构,诀窍将是定义所有的结构。   我现在正在探索使用Parsekit并创建语法,但学习曲线非常陡峭。我认为不是在接下来的几个星期把它弄清楚,然后意识到这不是正确的方法,而是我想问。

人们在解析这些事情时想要分享的任何见解/资源? 谢谢,奥利维尔

1 个答案:

答案 0 :(得分:7)

ParseKit的开发人员。

(我的回答要记住一件事:虽然我是ParseKit的开发人员,但我并没有真正设计框架或其API。它主要基于Steven Metsker的书Building Parsers With Java中的特定设计。我只是将它们移植到ObjC / Cocoa。)


ParseKit由三部分组成:

  1. 高度灵活,高性能的 Objective-C Tokenizer PKTokenizerPKToken类)
  2. 一个完全动态的 Objective-C Parser工具包,用于构建具有无限前瞻(PKParser类和子级)的回溯,递归式解析器。由于其动态性,此解析器工具包的性能对于大输入而言很差。
  3. 通过语法生成Objective-C解析器 - 使用BNF样式的语法语法(类似于yacc或ANTLR)为您的自定义语言生成Objective-C解析器。解析时,解析器将为您的Objective-C代码提供回调。由于#2的活力,编写语法相对容易,而且你在语法中可以做的事情的限制相对较少。
  4. 上面的每个组件都基于先前的组件。所以#3 - 语法工具包 - 使用#1标记化器和#2解析器工具包。

    如果您正在进行任何严肃的解析任务,我会始终建议签出#1 - 令牌化程序 - PKTokenizer。它非常灵活,功能强大,性能非常好。如果你更容易使用令牌而不是输入字符串(通常是),你可能想要检查一下。

    对于#2(ObjC Parser工具包),你通常只想跳过它并转到#3,因为通过语法构建解析器要比通过ObjC代码构建解析器好得多。

    对于#3(通过BNF Grammars的ObjC Parser工具包),最重要的考虑因素是性能。 ParseKit的解析器工具包适用于解析相对较小的输入字符串。一些例子可能是:

    1. XPath样式的查询语言
    2. SQL
    3. 相对简明的DSL或命令语言
    4. 正则表达式
    5. 菜单(或者可以分解为相对较小句子的平面数组)
    6. ParseKit的解析器工具包通常适合解析较大的输入字符串,因为性能问题。一些例子可能是:

      1. XML文档
      2. JSON文件
      3. ParseKit当然可以(并确实)解析这些类型的输入,但是由于ParseKit的动态性(回溯,infinte lookeahead),与专用的XML或JSON解析器相比,性能也很差。


        对于“葡萄酒菜单”,我会说,是的 - ParseKit可能是一个很好的(可能是很好的)解决方案。特别是如果你可以将输入的各行分成一个字符串数组并逐个解析它们。性能应该非常好,一旦你克服了学习曲线,ParseKit对于这些类型的工作来说非常强大/方便。

        事实上,IIRC,Metsker的原着甚至用这样的东西作为好用的工具包的例子。

        希望这有帮助。