Мне многократно приходилось писать "наколеночные" решения для разбора каких-нибудь данных. Почти всегда возникал соблазн схалтурить, не делать отдельный лексический разбор. В 100% случаев это приводило к тому, что в итоге получалась какая-то дрянь. Поэтому я стал придерживаться правила всегда выделять лексический анализатор. Ну не должен парсер заниматься пробелами. Или, скажем, используется рекурсивный разбор, а файл преждевременно кончился.
Вот такие личные предпочтения.

Мне в этом вопросе непонятно вот что. В примерах использования Parsec на Haskell, похоже спокойно обходятся без лексического анализатора и хорошо живут. К сожалению, не было ресурсов углубиться в этот вопрос и разобраться, в чем там дело.