reworked lexer