这真的取决于你开始和想要做什么。没有一个适合所有人的。
如果有一个LR语法(例如,您正在使用Yacc语法),将它转换为适用于Parsec或uu-parsinglib的LL语法是一项很好的工作。然而,许多sepBy等解析器在这里非常有帮助,但您应该期望解析器比Happy + Alex慢。
对于LL组合器解析,uu-parsinglib和它的前身uu-parsing很不错,但它们缺少像Parsec的Token和Language模块之类的东西,所以可能不太方便。有些人喜欢Malcolm Wallace的Parselib,因为他们与Parsec有不同的模型来进行回溯,但我没有经验。
如果您正在解码某些格式化文件而不是编程语言,Attoparsec或类似软件可能比Parsec或uu-parsinglib更好。在这种情况下更好的是速度更快 - 不仅仅是ByteString与Char,但我认为Attoparsec在错误处理/源位置跟踪方面的工作较少,所以解析器应该运行得更快,因为他们每个输入元素的工作量较少。另外,请记住,文本文件格式可能并不总是有语法,因此您可能必须定义一些自定义组合器来执行特殊的词法技巧,而不是仅为每个元素定义“分析器组合器”。
对于LR解析,我发现Ralf Hinze的Frown比Happy更好 - 更好的错误支持和更好的语法文件格式,但是Frown没有被主动维护,并且不在Hackage上。我认为它是LR(k)而不是LR(1),这意味着它更强大w.r.t.展望。
表现并不是真正的大问题w.r.t.一个语法。编程语言有复杂的语法,但你可以期望相当小的文件。至于数据文件格式,格式设计者真的应该以这样的方式来设计它,以便高效地解析。对于combinator解析器,你不应该为数据格式文件需要许多高级功能 - 如果你这样做,或者格式设计的很糟糕(这有时会不幸发生),或者你的解析器是。
为了记录我写了一个带有Frown的C语法分析器,带有Happy的GL-shading语言,带有UU_Parsing的未完成的C语法分析器,以及许多Parsec的事情。对于我来说,我选择的是LR语法--Frown或Happy(现在不用维护Frown),否则通常是Parsec(正如我所说的uu_parse很好,但缺乏LanguageDef的便利)。对于二进制格式我自己推出,但我通常有特殊要求。
这是一个有趣的答案。有没有人有关于Packrat解析/ PEG的意见或有趣的故事? http://pdos.csail.mit.edu/~baford/packrat/ – gawi 2010-11-03 18:01:36
PEG解析器显然是一项非常有趣的技术,在Bryan Ford的工作之后,它们在其他语言中已经非常流行。我自己的感觉是Pappy与Parsec相比,“工业强度”要低得多,所以它从未在Haskell中起飞过。对于其他语言,PEG解析器与LR解析器生成器竞争,这些解析器生成器相当不灵活,因此它们已经非常成功。 – 2010-11-03 18:52:59
弗里斯比在纸上看起来不错:http://repetae.net/computer/frisby/ – gawi 2010-11-04 00:28:03