是否有任何解析器组合器库可以提供与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的解析器,需要足够快的解析,以免将来改变它。
答案 0 :(得分:7)
还有另一种选择:polyparse。
去年的GSoC之后,parsec3进行了优化,不再明显慢于parsec2
几年前我已经对几个语法(中等大小)进行了测试,发现happy / alex,parsec2 / alex,parsec2和polyparse的表现非常接近。 Attoparsec在字节流上更快,但我需要多字节。
我的建议:看看替代方案处理内部和用户定义的状态并报告错误的方式,并根据这些标准进行选择。