Вы получите лучшие сообщения об ошибках с manyTill
:
> parse (manyTill (char '.') eof) "" "a"
Left (line 1, column 1):
unexpected 'a'
expecting end of input or "."
Это просто из-за того, как вы цепляетесь с >>
. Если первый анализатор завершится успешно, будет запущен второй. many
успешно, поэтому попытка eof
. eof
терпит неудачу, поэтому вы получаете только сообщение об ошибке eof
.
С manyTill
он пробует оба синтаксических анализатора (второй первый), и, если оба не удаются, сообщения об ошибках объединяются (это потому, что он использует <|>
внутри).
В целом проще определить собственные ошибки с помощью <?>
:
> parse (many (char '.') >> eof <?> "lots of dots") "" "a"
Left (line 1, column 1):
unexpected 'a'
expecting lots of dots