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
他们是一样的吗?
答案 0 :(得分:40)
目前有两种广泛使用的主要版本的Parsec,Parsec 2和 Parsec 3。
我的建议只是使用最新版本的Parsec 3.但是如果你愿意的话 做出有意识的选择,请继续阅读。
Parsec 3引入了一个monad变换器ParsecT
,可用于组合
用其他monadic效果解析。
虽然Parsec 2允许您选择令牌类型(这对您有用) 想要将词法分析与解析分开),令牌总是如此 列入清单。列表可能不是要存储的最有效的数据结构 大文本。
Parsec 3可以处理任意流 - 具有类似列表的数据结构
接口。您可以定义自己的流,但Parsec 3还包括一个流行的
基于ByteString的高效Stream实现(基于Char
-
解析),通过模块Text.Parsec.ByteString
和
Text.Parsec.ByteString.Lazy
。
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 (基准:1,2)。
可以在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实现的。