lexer refactor