Text.ParserCombinators.Parsec和Text.Parsec有什么区别?

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

它们是相同的吗?

2个回答

41
目前,Parsec有两个广泛使用的主要版本:Parsec 2和Parsec 3。
我的建议是简单地使用最新版本的Parsec 3。但如果您想做出认真的选择,请继续阅读。
Parsec 3引入了一个单子变换器ParsecT,它可以用于将解析与其他单子效果相结合。
虽然Parsec 2允许您选择令牌类型(当您希望将词法分析与解析分开时很有用),但标记始终被排列成列表。列表可能不是存储大文本的最有效数据结构。
Parsec 3可以处理任意流--具有类似列表的接口的数据结构。您可以定义自己的流,但Parsec 3还包括一种基于ByteString的流实现(用于基于Char的解析),通过模块Text.Parsec.ByteString和Text.Parsec.ByteString.Lazy公开。
更喜欢Parsec 2的原因:
提供的高级功能并非免费;要实现它们需要几个语言扩展。
两个版本都不是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略慢(基准测试:12)。

兼容层

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

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


变压器的链接似乎现在无法访问。 - awllower
谢谢通知,我已经将其删除。 - Roman Cheplyaka
Text.Parsec 是否等于 Parsec 3,而 Text.ParserCombinators.Parsec 是否等于 Parsec 2? - Anthony Raimondo

18

我认为后者是Parsec 2的向后兼容层,它采用了更新的API实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接