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