between l r m
не делает ничего впечатляющего, на самом деле он просто пытается l
, затем m
, затем r
и возвращает результат m
. Итак, в between (char '"') (char '"') (many charLiteral)
many charLiteral
не знает, что он не должен потреблять "
. many
просто продолжает потреблять все, что принимает синтаксический анализатор аргументов ... что, поскольку charLiteral
просто принимает все, , означает, что он перемешивает все до конца ввода. У второго char '"'
нет способа остановить это, ему просто нужно обойтись тем, что осталось ... т.е. сбой , потому что там это ничего не осталось!
Напротив, manyTill
на самом деле проверяет, совпадает ли «до», и только применяет каждую итерацию анализатора контента, когда это не так. Следовательно, завершающий "
не передается в charLiteral
, и вы получаете желаемое поведение.