Parsekit或我自己解析?

otu*_*web 4 cocoa grammar objective-c parsekit

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

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

Tod*_*orf 7

这里是ParseKit的开发者.

(我的回答要记住一件事:虽然我是ParseKit的开发人员,但我并没有真正设计框架或它的API.它主要基于Steven Metsker的书" 用Java构建解析器"中的特定设计.我只是移植了他们到ObjC/Cocoa.)


ParseKit由三部分组成:

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

上面的每个组件都基于先前的组件.所以#3 - 语法工具包 - 使用#1标记化器和#2解析器工具包.

如果你正在做任何严肃的解析任务,我总是建议检查#1 - tokenizer - PKTokenizer.它非常灵活,功能强大,性能非常好.如果你更容易处理令牌而不是输入字符串(通常是),你可能想要检查它.

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

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

  1. XPath样式的查询语言
  2. SQL
  3. 相对简明的DSL或命令语言
  4. 常用表达
  5. 菜单(或者可以分解为相对较小句子的平面数组的东西)

由于性能问题,ParseKit的解析器工具包通常适合解析较大的输入字符串.一些例子可能是:

  1. XML文档
  2. JSON文档

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


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

事实上,IIets,Metsker的原着书甚至使用这样的东西作为好用的工具包的一个例子.

希望这可以帮助.