first impl of lexer