Attoparsec解析失败但不应该进行适当的回溯

时间:2017-04-16 22:11:14

标签: regex haskell backtracking parsec attoparsec

我正在使用Attoparsec,据说默认情况下会回溯。但是,以下行:

parseOnly  (string "foo" *> many1 anyChar <* string "bar") "fooxxxbar"

失败了:

Left "not enough input"

为什么会这样?如果many1 anyChar决定只解析三个字符(xxx),那么它应该会成功。它应该考虑在某些时候因为回溯而这样做,不应该吗?

使用Attoparsec进行等效/foo(.*)bar/正则表达式的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

  

我正在使用Attoparsec,据说默认情况下会回溯。

不完全。 Attoparsec 支持支持回溯,但仅限于某些明确的情况(文档说明的情况)。它的目的是进行高性能的解析,并且不出所料,它在回溯方面表现不佳。

您正在寻找manyTillmanyTill'。请注意,文档中提到了回溯行为。

ghci> manyTill1 p e = (:) <$> p <*> manyTill p e 
ghci> parseOnly (string "foo" *> manyTill1 anyChar (string "bar")) "fooxxxbar"
Right "xxx"