Ну так это более-менее обычное дело. menhir — это же LR(1)? Если да, и язык простой, то и "трюков" много не нужно... Вот с LALR в lexer "прячут" куда больше. ;)
А зачем "без генератора"? К тому же, если есть готовая проверенная грамматика, подход хренак, хренак, и в продакшен recursive descent никто не отменял, и это очень просто.
Я ещё никогда не сталкивался с необходимостью писать свой парсер, без генератора. Наверное, в определённых кейсах это имеет смысл, ведь во многих языках используется самописный парсер.