在haskell中的attoparsec或parsec
我必须parsing一些文件,并将其转换为一些预定义的数据types。
Haskell似乎提供了两个包:
- attoparsec
- 秒差距
它们之间有什么区别,哪一个更适合根据一些规则parsing文本文件?
秒差距
Parsec对于“面向用户”的parsing器来说是很好的:你有一个有限的input,但是错误信息很重要。 这不是非常快,但如果你有小的投入,这应该不重要。 例如,我会select几乎任何编程语言工具的Parsec,因为绝对地说,即使是最大的源文件也不是那么大,但是错误信息真的很重要。
Parsec可以处理不同的inputtypes,这意味着您可以使用标准String
或来自某种外部词法分析器的令牌stream。 由于它可以使用String
,所以它能够很好地处理Unicode。 像digit
和letter
这样的内置基本parsing器是可识别Unicode的。
Parsec还带有一个monad变换器,这意味着你可以将它分层堆叠。 例如,如果您想在分析过程中跟踪附加状态,这可能会很有用。 你也可以去寻找非确定性的parsing,或者其他的东西 – monad变换器的魔法。
Attoparsec
Attoparsec比Parsec快得多。 你应该使用它,当你期望得到大量的input或性能真的很重要。 这对networking代码(parsing数据包结构),分析大量原始数据或使用二进制文件格式很有帮助。
Attoparsec可以使用二进制数据ByteString
。 这使得它是一个很好的select,如二进制文件格式的东西。 然而,因为这是二进制数据,它不处理像文本编码的东西; 为此,您应该使用Text
的attoparsec模块。
Attoparsec支持增量parsing,Parsec不支持。 这对于某些应用程序(如networking代码)非常重要,但对其他应用程序无关紧要。
Attorparsec的错误信息比Parsec差,并牺牲了一些高级function的性能。 它专门用于Text
或ByteString
,所以不能将它用于自定义词法分析器的标记。 它也不是一个monad变压器。
哪一个?
最终,Parsec和Attoparsec迎合了不同的利基。 高级别的差异是性能:如果你需要它,selectAttoparsec; 如果你不这样做,就去Parsec吧。
我通常的启发是selectParsec编程语言,configuration文件格式和用户input,以及几乎任何我会用正则expression式。 这些通常是由手工生成的,因此parsing器不需要扩展,但是需要很好地报告错误。
另一方面,我会selectAttoparsec来实现networking协议,处理二进制数据和文件格式或读取大量自动生成的数据。 你正在处理的时间限制或大量的数据,通常不是直接写人。
正如你所看到的,select实际上通常很简单:用例不会重叠。 很有可能,对于任何给定的应用程序来说,哪一个都会很清楚。