44
Text
    Text.Parsec
        Text.Parsec.ByteString
            Text.Parsec.ByteString.Lazy
        Text.Parsec.Char
        Text.Parsec.Combinator
        Text.Parsec.Error
        Text.Parsec.Expr
        Text.Parsec.Language
        Text.Parsec.Perm
        Text.Parsec.Pos
        Text.Parsec.Prim
        Text.Parsec.String
        Text.Parsec.Token
    ParserCombinators
        Text.ParserCombinators.Parsec
            Text.ParserCombinators.Parsec.Char
            Text.ParserCombinators.Parsec.Combinator
            Text.ParserCombinators.Parsec.Error
            Text.ParserCombinators.Parsec.Expr
            Text.ParserCombinators.Parsec.Language
            Text.ParserCombinators.Parsec.Perm
            Text.ParserCombinators.Parsec.Pos
            Text.ParserCombinators.Parsec.Prim
            Text.ParserCombinators.Parsec.Token

他们是一样的吗?

4

2 回答 2

40

目前有两个广泛使用的 Parsec 主要版本:Parsec 2 和 Parsec 3。

我的建议只是使用 Parsec 3 的最新版本。但是,如果您想做出认真的选择,请继续阅读。

秒差距 3 中的新功能

单子变压器

Parsec 3 引入了一个单子变换器 ,ParsecT它可以用来将解析与其他单子效果结合起来。

尽管 Parsec 2 允许您选择标记类型(这在您想将词法分析与解析分开时很有用),但标记始终排列成列表。列表可能不是存储大文本的最有效的数据结构。

Parsec 3 可以处理任意——具有类似列表接口的数据结构。您可以定义自己的流,但 Parsec 3 还包括一个流行且高效的 Stream 实现,它基于 ByteString(Char基于 for 的解析),通过模块Text.Parsec.ByteStringText.Parsec.ByteString.Lazy.

喜欢 Parsec 2 的原因

需要的扩展更少

Parsec 3 提供的高级功能不是免费提供的;要实现它们,需要几个语言扩展。

这两个版本都不是 Haskell-2010(即都使用扩展),但 Parsec 2 使用的扩展比 Parsec 3 少,因此任何给定编译器可以编译 Parsec 2 的机会都高于 Parsec 3。

到目前为止,这两个版本都可以与 GHC 一起使用,据报道Parsec 2 也可以使用 JHC 构建,并作为 JHC 的标准库之一包含在内。

表现

最初(即从 3.0 版本开始)Parsec 3 比 Parsec 2 慢得多。但是,已经完成了提高 Parsec 3 性能的工作,并且从 3.1 版本开始,Parsec 3 仅比 Parsec 2 稍慢(基准:1 , 2) .

兼容层

在 Parsec 3 中“重新实现”所有 Parsec 2 API 是可能的。此兼容性层由 Parsec 3 包在模块层次结构下提供 Text.ParserCombinators.Parsec(与 Parsec 2 使用的层次结构相同),而新的 Parsec 3 API在Text.Parsec层次结构下可用。

这意味着您可以使用 Parsec 3 作为 Parsec 2 的替代品。

于 2011-05-18T05:27:09.997 回答
18

我相信后者是 Parsec 2 的向后兼容层,根据较新的 API 实现。

于 2011-05-17T11:37:35.133 回答