Общее решение состоит в том, чтобы все ваши парсеры пропускали конечный пробел. Проверьте lexeme
(в ParsecToken
) в документах Parsec для аккуратного способа сделать это или просто подхватить простую версию самостоятельно:
lexeme parser = do result <- parser
spaces
return result
Затем используйте эту функцию на всех ваших токенах (например, числовых литералах). Таким образом, вам только нужно беспокоиться о пробелах в самом начале выражения.
Подробнее о ParsecToken
и друзьях см. В разделе «Лексический анализ» документа Parsec .
.
Имеет смысл пропускать только пробел после токена, кроме как в самом начале, где вы можете пропустить его вручную. Вам следует использовать этот подход, даже если вы в конечном итоге не используете модуль ParsecToken
.
Кажется, у вас уже есть tok
, который действует как мой lexeme
, за исключением того, что он использует пробелы на обеих сторонах. Измените его на использование только пробела после токена и просто игнорируйте пробелы в самом начале ввода вручную. Это должно (в идеале :)) решить проблему.