【问题标题】:Attoparsec parse fails but shouldn't with proper backtrackingAttoparsec 解析失败,但不应该有适当的回溯
【发布时间】:2017-04-16 22:11:14
【问题描述】:

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

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

失败:

Left "not enough input"

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

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

【问题讨论】:

    标签: regex haskell backtracking parsec attoparsec


    【解决方案1】:

    我正在使用据说默认回溯的 Attoparsec。

    不完全是。 Attoparsec 确实支持回溯,但仅在某些明确的情况下(文档说明它支持)。它的目的是高性能解析,不出所料,它不能很好地配合回溯。

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

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

    【讨论】:

    • 好吧,文档明确指出:“attoparsec 解析器总是在失败时回溯”。有哪些解析器组合器具有完整的回溯支持?性能对我来说不是问题,manyTill 的建议解决方案不适用于我的用例。
    • @IguanaBob regex-applicative 不会回溯,但如果可能的话,总会成功。 ReadP 具有相同的属性,可以解析更多的语法。 ReadS 基本上是一个效率较低的 ReadP,并且实际上是回溯——但我认为“回溯”是您关心的不动产的实现细节,这三个都满足。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多