Из документации для manyTill , он запускает первый аргумент ноль или более раз , поэтому 2 новых строки в строке все еще действительны, и ваш line
синтаксический анализатор не потерпит неудачу.
Возможно, вы ищете что-то вроде many1Till
(например, many1
против many
), но, похоже, его нет в библиотеке Parsec, поэтому вам, возможно, придется свернуть свое собственное: (предупреждение: I у меня нет ghc на этой машине, так что это полностью не проверено)
many1Till p end = do
first <- p
rest <- p `manyTill` end
return (first : rest)
или более краткий путь:
many1Till p end = liftM2 (:) p (p `manyTill` end)