implement Lexer