Attoparsec парсинг не удаётся, но не должен при правильном возврате
Я использую Attoparsec, который, как говорят, возвращается по умолчанию. Тем не менее, следующая строка:
parseOnly (string "foo" *> many1 anyChar <* string "bar") "fooxxxbar"
не удается с:
Left "not enough input"
Почему это так? Если many1 anyChar
решает разобрать только три символа (xxx
) это должно быть успешным. И он должен рассмотреть возможность сделать это в какой-то момент из-за отступления, не так ли?
Как правильно сделать эквивалент /foo(.*)bar/
регулярное выражение с использованием 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"