哪个Haskellparsing技术是最令人愉快的使用,为什么?
“愉快”的意思,例如:你可以用一种“自然”的方式写出语法,而不必以复杂的方式重写它们,而不必引入枯燥的样板。
为了这个问题的目的,我们要规定,除非技术的performance是病态的,否则performance不是这里最大的问题。
尽pipe如此,您可能想提及一个技术是否因性能原因而重写语法。
当回答这个问题时,请给我一个关于您所使用的语法的大小和复杂性的想法。 此外,您是否使用过该技术的任何显着的“高级”特征,以及您对这些特征的印象如何。
当然,这个问题的答案可能取决于领域,在这种情况下,我很乐意了解这个事实。
这真的取决于你开始和你想做什么。 没有一个适合所有人。
如果有一个LR语法(例如,你正在使用Yacc语法),把它变成适用于Parsec或uu-parsinglib的LL语法是一个很好的工作。 然而,许多sepBy等parsing器在这里是非常有用的,但是你应该期望parsing器比Happy + Alex慢。
对于LL组合器parsing,uu-parsinglib和它的前身uu-parsing很不错,但是它们缺lessParsec的Token和Language模块,所以可能不那么方便。 有些人喜欢Malcolm Wallace的Parselib,因为他们跟Parsec有不同的模式,但是我没有经验。
如果你解码一些格式化的文件而不是编程语言,Attoparsec或类似的可能比Parsec或uu-parsinglib更好。 在这种情况下更好的是速度更快 – 不仅仅是ByteString与Char,而且我认为Attoparsec在error handling/源位置跟踪方面的工作较less,所以parsing器应该运行得更快,因为每个input元素的工作量较less。
另外,请记住,文本文件格式可能并不总是具有这样的语法,所以您可能必须定义一些自定义的组合器来执行特殊的词法技巧,而不是为每个元素定义“分析器组合器”。
对于LRparsing,我发现Ralf Hinze的Frown比Happy更好 – 更好的错误支持和更好的语法文件格式,但是Frown没有被主动维护,并且不在Hackage上。 我认为这是LR(k)而不是LR(1),这意味着它是更强大的前瞻。
对于语法来说,性能不是真正的大问题。 编程语言有复杂的语法,但你可以期望相当小的文件。 至于数据文件格式,这种格式的devise者确实应该以这种方式进行devise,以便高效的parsing。 对于combinatorparsing器,你不应该为数据格式文件需要许多高级function – 如果你这样做,或者格式devise的很糟糕(这有时会发生),或者你的parsing器是。
为了logging,我写了一个带有Frown的C语法分析器,带有Happy的GL-shading语言,带有UU_Parsing的未完成的C语法分析器,以及许多Parsec的事情。 对于我来说,我的select是从LR开始的语法 – 皱眉或开心(现在皱眉没有保持开心),否则通常是Parsec(正如我所说uu_parse很好,但缺乏LanguageDef的便利)。 对于二进制格式我自己推出,但我通常有特殊的要求。
我们使用'uu-parsinglib'取得了巨大的成功 – 我们已经从Parsec转向了它,因为它更加灵活和强大 – 例如,如果需要,它可以支持惰性parsing,而且不需要明确地使用组合器(如Parsec中的“尝试”)来标记可能的回溯点。
诚然,目前你们需要在事物的表面化方面做更多的事情,但对于我们来说,这与图书馆的基本优势相比是一个小点。
最近,我在uu-parsinglib中重写了一个用parsec编写的DSLparsing器。 我发现它大大简化了程序。 我的主要动机是获得自动更正的方面。 这只是工作。 这几乎是免费的! 另外,我更喜欢以适用的风格来写我的parsing器,而不是Parsec的monadic风格。