2013-04-25 4 views
14

Одной из распространенных проблем, с которыми я столкнулся с Parsec, является то, что он имеет тенденцию игнорировать недопустимый ввод, если он встречается в «правильном» месте.Parsec: Потребляйте все входные данные

В качестве конкретного примера, предположим, что мы имеем integer :: Parser Int, и я пишу

expression = sepBy integer (char '+') 

(Игнорировать пробельные проблемы на мгновение.)

Это правильно разбирает что-то вроде "123 + 456 + 789". Однако, если я подаю его «123 + 456-789», он весело игнорирует незаконный символ «-» и конечную часть выражения; Я действительно хотел, чтобы сообщение об ошибке сообщало мне о некорректном вводе, а не просто молчаливо игнорировало эту часть.

Я понимаю почему это происходит; я не уверен, как это исправить. Каков общий метод проектирования парсеров, которые потребляют , все прилагаются к входу и преуспевают только в том случае, если все это является допустимым выражением?

ответ

26

Это на самом деле довольно просто - обеспечить за ним следует eof:

parse (expression <* eof) "<interactive>" "123+456-789" 

eof соответствует конец ввода, даже если вход просто строка, а не файл.

Очевидно, что это имеет смысл только на верхнем уровне вашего синтаксического анализа.

Смежные вопросы