【发布时间】:2010-06-21 04:53:57
【问题描述】:
Haskell 中有许多开源的parser implementations 可供我们使用。 Parsec 似乎是文本解析的标准,attoparsec 似乎是二进制解析的流行选择,但除此之外我不知道太多。您是否遵循特定的决策树来选择解析器实现?您对图书馆的优势或劣势有什么有趣的了解吗?
【问题讨论】:
Haskell 中有许多开源的parser implementations 可供我们使用。 Parsec 似乎是文本解析的标准,attoparsec 似乎是二进制解析的流行选择,但除此之外我不知道太多。您是否遵循特定的决策树来选择解析器实现?您对图书馆的优势或劣势有什么有趣的了解吗?
【问题讨论】:
你有几个不错的选择。
对于String类型的轻量级解析:
对于打包的字节串解析,例如HTTP headers.
对于大多数人使用的实际二进制数据:
要问自己的主要问题是底层字符串类型是什么?
该决定很大程度上决定了您将使用哪种解析器工具集。
要问的第二个问题是:我是否已经有了数据类型的语法?如果是这样,我可以使用快乐
显然,对于自定义数据类型,有各种优秀的现有解析器:
【讨论】:
只是添加到 Don 的帖子中:就我个人而言,我非常喜欢 Text.ParserCombinators.ReadP(base 的一部分),因为它是快速简单的东西。特别是当 Parsec 看起来有点矫枉过正时。
字节串版本有一个 bytestringreadp 库,但它不包括 Char8 字节串,我怀疑 attoparsec 在这一点上会是一个更好的选择。
【讨论】:
我最近将一些代码从 Parsec 转换为 Attoparsec。两者都相当有能力。
Attoparsec 在性能和内存占用方面胜出,但 Parsec 提供更好的错误报告并拥有更完整的文档。
【讨论】:
Bryan O'Sullivan 的博文 What’s in a parser? Attoparsec rewired (2/2) 包含一个很好的性能基准,比较了几种实现以及一些比较内存使用情况的 cmets。
【讨论】: