gpt4 book ai didi

parsing - 选择的解析器组合器库(haskell)

转载 作者:行者123 更新时间:2023-12-02 12:45:32 25 4
gpt4 key购买 nike

是否有任何解析器组合器库可以提供与 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 相比,Happy/Alex(对我来说)相当不友好,BNFC 不灵活在我的例子中,解析后需要额外的 AST 遍历。另外,错误处理也不是很好。

其余选项共有三个:Parsec2、Parsec3 和 uu-parselib。我发现了许多有争议的基准测试,假设 Parsec2 比 Parsec3 更快,或者 UU 更快,或者更慢。

但是该选择什么?有人有使用 uu-parselib 的经验吗?我需要某种 DSL 的解析器,需要解析速度足够快,以便将来不会更改它。

最佳答案

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

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

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

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

关于parsing - 选择的解析器组合器库(haskell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6742367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com