Думаю, вы немного запутались в том, что такое функция лексера. Лексический анализатор преобразует программу в токены:
while (1)
становится
<TOK_WHILE> <TOK_LPAREN> <TOK_NUM, 1> <TOK_RPAREN>
Конечно, лексическое выражение может обнаруживать ошибки (например, неожиданные символы (символ не входит в набор распознаваемых символов). )), но он не может обнаруживать синтаксические c ошибки, если дизайн не отличается от традиционных лексических анализаторов (как упомянул @Marquis of Lorne). Короче говоря, все, что делает лексический анализатор (в большинстве случаев), - это преобразование потока символов (программы) в токены из парсера для проверки синтаксических ошибок (и в большинстве случаев построения дерева синтаксического анализа et c.).