Text.ParserCombinators.Parsec和Text.Parsec之间有什么区别

时间:2011-05-17 10:15:33

标签: haskell parsec

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

他们是一样的吗?

2 个答案:

答案 0 :(得分:40)

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

我的建议只是使用最新版本的Parsec 3.但是如果你愿意的话 做出有意识的选择,请继续阅读。

Parsec 3中的新内容

Monad Transformer

Parsec 3引入了一个monad变换器ParsecT,可用于组合 用其他monadic效果解析。

虽然Parsec 2允许您选择令牌类型(这对您有用) 想要将词法分析与解析分开),令牌总是如此 列入清单。列表可能不是要存储的最有效的数据结构 大文本。

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

更喜欢Parsec 2

的原因

需要更少的扩展

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

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

此时两个版本都适用于GHC,而Parsec 2也适用于reported 使用JHC构建,并作为JHC的标准库之一。

性能

最初(即3.0版本)Parsec 3比它慢得多 Parsec 2.然而,work on improving Parsec 3 performance已经完成, 从版本3.1开始,Parsec 3仅略慢于Parsec 2 (基准:12)。

兼容性层

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

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

答案 1 :(得分:18)

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