В документации для Text.Megaparsec.Char.Lexer.charLiteral
предлагается использовать char '"' *> manyTill charLiteral (char '"')
для разбора строковых литералов (где manyTill
определено в модуле Control.Applicative.Combinators
в библиотеке parser-combinators
).
Однако Control.Applicative.Combinators
также определяет between
, который, насколько я понимаю, должен делать то же самое, что и приведенное выше предложение, когда используется так: between (char '"') (char '"') (many charLiteral)
.
Однако использование синтаксического анализатора between
, описанного выше, не работает для синтаксического анализа строковых литералов — возникает ошибка "неожиданный конец ввода. Ожидается """ или литеральный символ" (указывающий на то, что конечная кавычка никогда не обнаруживается). Почему бы и нет?
Кроме того, в более общем плане, почему between pBegin pEnd (many p)
не эквивалентно pBegin *> manyTill p pEnd
?
charLiteral
на самом деле потерпел неудачу на"
(но все еще потреблял символ, поэтому управление не было бы возвращено тому, что идет послеmany
). Но в этом случаеmany charLiteral
действительно удается — он успешно потребляет все входные данные. — Во всяком случае, megaparsec делает автоматический возврат для простых символов и строк, но не для больших комбинаторов. - person leftaroundabout   schedule 06.05.2020regex-applicative
и сReadP
, но не работает, как вы и ожидали, сattoparsec
. Я сбит с толку, потому что думал, чтоattoparsec
отступил, как и остальные. - person Joseph Sible-Reinstate Monica   schedule 06.05.2020