Parser Combinators首选库(haskell)

时间:2011-07-19 04:39:49

标签: 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 rest  -- oops... O(N)
    error $ show token

解决方法非常难看:

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

此外,Attoparsec缺乏错误处理。

对于ocamlyacc / ocamllex,快乐/ Alex对我来说是非常不友好的,BNFC是不灵活的 在我的情况下,解析后需要额外的AST遍历。此外,错误处理不是很好。

有三种休息选项:Parsec2,Parsec3和uu-parselib。我发现一些有争议的基准测试假设Parsec2比Parsec3快,或者UU更快,或者更慢。

但是要选择什么?有没有人有使用uu-parselib的经验?我需要某种DSL的解析器,需要足够快的解析,以免将来改变它。

1 个答案:

答案 0 :(得分:7)

  1. 还有另一种选择:polyparse。

  2. 去年的GSoC之后,parsec3进行了优化,不再明显慢于parsec2

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

  4. 我的建议:看看替代方案处理内部和用户定义的状态并报告错误的方式,并根据这些标准进行选择。