Одной из распространенных проблем, с которыми я столкнулся с Parsec, является то, что он имеет тенденцию игнорировать недопустимый ввод, если он встречается в «правильном» месте.Parsec: Потребляйте все входные данные
В качестве конкретного примера, предположим, что мы имеем integer :: Parser Int
, и я пишу
expression = sepBy integer (char '+')
(Игнорировать пробельные проблемы на мгновение.)
Это правильно разбирает что-то вроде "123 + 456 + 789". Однако, если я подаю его «123 + 456-789», он весело игнорирует незаконный символ «-» и конечную часть выражения; Я действительно хотел, чтобы сообщение об ошибке сообщало мне о некорректном вводе, а не просто молчаливо игнорировало эту часть.
Я понимаю почему это происходит; я не уверен, как это исправить. Каков общий метод проектирования парсеров, которые потребляют , все прилагаются к входу и преуспевают только в том случае, если все это является допустимым выражением?