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"
Другие вопросы по тегам