Ну, не все парсеры в Text.Parsec.Token
используют lexeme
, хотя все
их должны . Хуже всего не задокументировано, кто из них потребляет белый
пространство, а какие из них нет. Некоторые парсеры в Text.Parsec.Token
после лексемы потребляют пробелы, некоторые из них этого не делают. Некоторые из них
потреблять ведущие пробелы, а также. Вы должны прочитать существующие проблемы на
GitHub средство отслеживания ошибок, если вы хотите полностью контролировать ситуацию.
В частности:
decimal
, hexadecimal
и octal
парсеры не не используют трейлинг
пустое пространство, см
источник ,
и этот выпуск ;
integer
также занимает лидирующие пробелы, см.
этот номер ;
остальные из них вероятно потребляют конечные пробелы и, следовательно, переводы строк,
однако это трудно сказать наверняка, потому что код Parsec
особенно волосатые (ИМХО) и в проекте нет ни одного набора тестов (кроме 3
тесты, которые проверяют, что уже исправленные ошибки не появляются снова, однако
этого недостаточно для предотвращения регрессий, и каждое изменение в источнике может
сломайте ваш код в следующей версии Parsec .)
Существуют различные предложения, как сделать его настраиваемым (что должно быть
считается пустым пространством), ни один из них по каким-либо причинам не объединен или не прокомментирован.
Но настоящая проблема скорее в дизайне Text.Parsec.Token
, который блокирует
пользователь в решениях, построенных makeTokenParser
. Этот дизайн особенно
негибкий. Есть много случаев, когда единственным решением является копирование
весь модуль и отредактируйте его при необходимости.
Но если вы хотите современный и неповторимый Parsec, есть возможность переключиться на
Мегапарсек где это (и
многие другие) проблема не существует.
Раскрытие информации : Я один из авторов Мегапарсек.