我正在尝试用一个函数来扩充 Haskell 的 Attoparsec 解析器库
takeRegex :: Regex -> Parser ByteString
使用其中一种正则表达式实现。
(动机:好的正则表达式库可以提供与输入长度成线性关系的性能,而 attoparsec 需要回溯。我的一部分输入特别适合使用正则表达式进行解析,甚至回溯 Text.Regex.PCRE 库也让我受益该部分的 attoparsec 代码加速了 4 倍。)
Attoparsec曾经有一个getInput :: Parser ByteString
函数来获取(不消耗)剩余输入;这对我的目的来说可能是非常完美的,因为我的输入是非增量的、严格的并且相当小——我一次运行解析器以获取一行日志文件。有了它,我似乎可以做类似的事情
takeRegex re = do
input <- getInput
m <- matchM re input
take $ length m
不幸的是,最近版本的 attoparsec 缺少此功能。有什么方法可以达到同样的效果吗?为什么这个功能被删除了?
现在有一个takeByteString :: Parser ByteString
函数,它接受并消耗其余的输入。如果有一个函数可以尝试解析并在不实际消耗任何内容的情况下获取结果,则可以将其与它结合使用,但我似乎也找不到(或弄清楚如何实现)这样的函数。
有没有办法用当前版本的 attoparsec 来实现这一点?