In realtà dipende tutto da cosa devi gestire...
In una stringa di caratteri dove ogni byte codifica un'istruzione ad esempio andresti meglio a leggere carattere per carattere (ovviamente con un po' di buffering dietro per ragioni di performance).
Poi dal lato opposto un (un generico) lex potrebbe non bastarti, ad esempio potresti dover aggiungere qualcosa tipo yacc et simila.

Percui non è il caso di generalizzare, dovresti almeno presentare la struttura generica di questo linguaggio proprietario...