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
Run Code Online (Sandbox Code Playgroud)
它们是一样的吗?
Rom*_*aka 40
目前有两种广泛使用的主要版本的Parsec,Parsec 2和Parsec 3.
我的建议只是使用最新版本的Parsec 3.但如果你想做出有意识的选择,请继续阅读.
Parsec 3引入了monad变换器,ParsecT可用于将解析与其他monadic效果相结合.
虽然Parsec 2允许您选择令牌类型(当您希望将词法分析与解析分开时很有用),但令牌始终排列在列表中.列表可能不是存储大型文本的最有效数据结构.
Parsec 3可以处理任意流 - 具有类似列表的接口的数据结构.您可以定义自己的流,但Parsec 3还包括一个基于ByteString(Char基于解析)的流行且高效的Stream实现,通过模块Text.Parsec.ByteString和
Text.Parsec.ByteString.Lazy.
Parsec 3提供的高级功能并非免费提供:要实现它们,需要多个语言扩展.
无论是两个版本的是Haskell的-2010(即都使用扩展),但秒差距2使用比秒差距3少的扩展,从而使任意给定的编译器可以编译秒差距2机会比那些秒差距3更高.
到目前为止,两个版本都使用GHC,而Parsec 2也报告使用JHC构建,并作为JHC的标准库之一.
最初(即,作为版本3.0)秒差距3是相当慢于秒差距2.然而,关于改进秒差距3性能工作已经完成,并且作为版本3.1秒差距3只比秒差距2稍慢(基准:1,2) .
可以在Parsec 3中"重新实现"所有Parsec 2 API.此兼容层由模块层次结构下的Parsec 3包
Text.ParserCombinators.Parsec(Parsec 2使用的相同层次结构)提供,而新的Parsec 3 API在Text.Parsec层次结构下可用.
这意味着您可以使用Parsec 3作为Parsec 2的替代品.