Parsing 解析器组合器选择库(haskell)

Parsing 解析器组合器选择库(haskell),parsing,haskell,Parsing,Haskell,是否有任何解析器组合器库可以提供与Happy/Alex相当的性能 我知道Attoparsec,但有时它运行得不好,如下面的示例所示: isToken c = isLetter c || isDigit c symbol :: Parser Expr symbol = do c <- skipSpace >> satisfy isLetter rest <- takeWhile isToken let token = C.cons c r

是否有任何解析器组合器库可以提供与Happy/Alex相当的性能

我知道Attoparsec,但有时它运行得不好,如下面的示例所示:

isToken c = isLetter c || isDigit c

symbol :: Parser Expr
symbol = do 
    c    <- skipSpace >> satisfy isLetter 
    rest <- takeWhile isToken
    let token = C.cons c rest  -- oops... O(N)
    error $ show token
isToken c=Isleter c | | isDigit c
symbol::Parser Expr
符号=do
c>胰岛移植
休息
  • 还有另一种选择:聚精氨酸

  • 在去年的GSoC之后,parsec3进行了优化,不再明显比parsec2慢

  • 几年前,我对几个语法(中等大小)进行了测试,发现happy/alex、parsec2/alex、parsec2和polyparse的性能非常接近。Attoparsec在字节流上更快,但我需要多字节


  • 我的建议是:看看备选方案处理内部和用户定义的状态和报告错误的方式,然后根据这些标准进行选择。

    您确定Parsec接近Happy/Alex吗?在这种情况下,使用Happy或BNFC毫无意义。可能有什么我可以自己运行的基准测试吗?不管效率如何,使用Happy这样的解析器生成器有一个好处,那就是你会收到语法错误和警告(比如歧义)。attoparces文本当时不存在,所以我没有测试它。如果你正在解析“人大小”的数据(即由人编写的文件),任何主流的解析器组合器库都应该具有良好的速度特性,尽管您可能需要注意控制您编写的解析器中的回溯。如果你正在解析巨大的数据文件,那么等式有点改变,我会在这一点上寻找基准,并考虑你可以用什么样的特性来换取速度(例如,源位置跟踪可以是一个显著的减慢)。不是答案,但我已经使用了Uu PasSelb很多。它非常强大,并且有一些很好的特性,比如自动流校正。我唯一的抱怨是,并不是所有的特征都是显而易见的;特别是如果您还不熟悉解析器。我从未遇到过速度方面的问题,但我的输入数据大多是KB大小。
    do { skipSpace; bs <- scan go True; when (null bs) (fail "Not a symbol"); return bs}
        where go True  c = if isLetter c then Just  False else Nothing
              go False c = if isToken c then Just Fasle else Nothing