1
148
分析Parsec适合“面向用户”的解析器:输入量有限,但错误消息很重要。它不是很快,但如果你有小的输入,这应该无关紧要。例如,对于几乎任何编程语言工具,我都会选择Parsec,因为从绝对意义上讲,即使是最大的源文件也不是 那个 大但错误的消息真的很重要。
Parsec可以处理不同的输入类型,这意味着您可以将其与标准一起使用
Parsec还附带了一个monad转换器,这意味着您可以将其分层到monad堆栈中。例如,如果您想在解析过程中跟踪其他状态,这可能会很有用。你也可以选择更令人眼花缭乱的效果,比如非确定性解析,或者其他什么——monad transformer的常见魔力。 Attoparsec公司Attoparsec比Parsec快得多。当您期望获得大量输入或性能真正重要时,应该使用它。它非常适合网络代码(解析数据包结构)、解析大量原始数据或使用二进制文件格式。
Attoparsec可以使用
Attoparsec支持增量解析,而Parsec不支持。这对于某些应用程序(如网络代码)来说非常重要,但对于其他应用程序来说并不重要。
Attorparsec的错误消息比Parsec更糟糕,并且为了性能牺牲了一些高级功能。它专门用于
哪一个?最终,Parsec和Attoparsec迎合了截然不同的利基市场。高级差异在于性能:如果您需要,请选择Attoparsec;如果你不这样做,就用Parsec吧。 我通常的启发式方法是为编程语言、配置文件格式和用户输入选择Parsec,以及几乎所有我会用正则表达式做的事情。这些通常是手工生成的,所以解析器不需要缩放,但它们确实需要很好地报告错误。 另一方面,我会选择Attoparsec来实现网络协议、处理二进制数据和文件格式或读取大量自动生成的数据。处理时间限制或大量数据的事情,这些通常不是由人类直接编写的。 正如您所看到的,选择通常非常简单:用例不会有太多重叠。很有可能,在任何给定的应用程序中使用哪一个都非常清楚。 |
LudvigH · 行模式的Parsec开始? 7 年前 |
ddccffvv · Parsec:一行上有多个可能的选项 11 年前 |
Sibi · haskell中的attoparsec或parsec 11 年前 |