4

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

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

4

1 回答 1

7

ParseKit的开发者在这里。

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


ParseKit 由三部分组成:

  1. 一个高度灵活、高性能的Objective-C Tokenizer ( PKTokenizer, PKTokenclasses)
  2. 一个完全动态的 Objective-C 解析器工具包,用于构建具有无限前瞻(PKParser类和子类)的回溯、递归体面的解析器。由于它的动态性,这个解析器工具包的性能对于大量输入来说很差。
  3. Objective-C Parser Generation via Grammars - 使用 BNF 样式的语法语法(类似于 yacc 或 ANTLR)为您的自定义语言生成 Objective-C 解析器。在解析时,解析器将为您的 Objective-C 代码提供回调。由于#2 的活力,编写语法相对容易,并且对您在语法中可以做什么的限制相对较少。

上面的每个组件都建立在先前的组件之上。所以 #3 - 语法工具包 - 使用 #1 标记器和 #2 解析器工具包。

如果您正在执行任何严肃的解析任务,我总是建议您查看 #1 - 标记器 - PKTokenizer。它非常灵活和强大,性能非常好。如果您使用标记而不是输入字符串更容易(通常是这样),您可能需要检查一下。

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

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

  1. XPath 风格的查询语言
  2. SQL
  3. 相对简洁的 DSL 或命令语言
  4. 常用表达
  5. 菜单(或可以分解成相对较小句子的扁平数组的东西)

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

  1. XML 文档
  2. JSON 文件

ParseKit 确实可以(并且确实)解析这些类型的输入,但是由于 ParseKit 的动态性(回溯、无限前瞻),与专用 XML 或 JSON 解析器相比,性能仍然很差。


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

事实上,Metsker 的原著 IIRC 甚至使用这样的东西作为一个很好地使用他的工具包的例子。

希望这可以帮助。

于 2012-04-18T16:58:42.650 回答