【问题标题】:Haskell Parser CombinatorsHaskell 解析器组合器
【发布时间】:2013-08-03 01:05:21
【问题描述】:

我阅读了很多有关 Haskell Parser Combinators 的内容,发现了很多主题,例如:

但所有这些主题都将Parser CombinatorsParser Generators 进行比较。

我想问你Parser Combinator 中的哪一个最适合以下条件:

  1. 我希望对用户的错误(包括错误恢复)和消息进行良好的控制
  2. 我希望能够为解析器提供一小部分文本(而不是一次整个文件)
  3. 我希望能够很好地重新设计语法(我目前正在开发语法,所以“很好的工作”很重要”
  4. 最终的解析器应该很快(性能很重要,但不如第 1-3 点那么重要)。

我发现,最流行的解析器组合器是:

【问题讨论】:

  • 我只知道 parsec,它是一个单子解析器。它相当容易使用,并且您可以很好地控制错误。
  • 我只使用过attoparsec,所以我不了解 Parsec 的第一手资料。 attoparsec 以速度极快而著称,但在错误消息方面却不是那么好。它针对前端用户永远不会看到错误消息的后端解析需求。
  • @AndrewMyers,我同意,我已经使用 attoparsec 来处理这类事情,它非常快速和简单(尤其是对于简单的语法)。它没有很多花哨的功能,比如 hackage 上的普通 parsec 库,但它支持 Text,这太棒了。
  • attoparsec 错误信息完全无法使用,但速度非常快。
  • uu-parsinglib 是,据我了解,为 1、2 和 3 提供了良好的配置,一直到向用户建议正确的语法(甚至自动输入它,尽管这可以烦人)。最好通过阅读"Combinator Parsing: A Short Tutorial" 来获得文档。

标签: parsing haskell parsec parser-combinators attoparsec


【解决方案1】:

我会说肯定会选择 Parsec,原因如下:

Attoparsec 旨在快速使用,但缺乏对您在 Parsec 中收到的错误消息的强大支持,因此这是您的第一点胜利。

我使用解析器组合库的经验是,无论是在 GHCi 中还是在测试中,测试解析器的各个部分都非常容易,因此所有这些都真正满足了第二点。最后,Attoparsec 和 Parsec 非常快。

最后,Parsec 出现的时间最长,并且具有许多有用的高级功能。这意味着一般的可维护性将变得更容易,Parsec 中有更多示例并且更多人熟悉它。 uu-parsinglib 绝对值得花时间去探索,但由于这些原因,我建议先熟悉 Parsec 是更好的课程。 (Alex 也是最推荐使用 Parsec 或其他方式的词法分析器,但我自己没有使用过。)

【讨论】:

  • 好点。我已经删除了一半的对话。此消息将在五秒钟内自毁,需要一天时间。
【解决方案2】:

如果有人发现这个问题,我会在这里发布我的答案。当前的答案已经过时了。

最好使用megaparsec 包作为解析器组合库。这是一个现代化的生产就绪库。它的README.md 包含与其他解析器组合库的出色比较:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多