Recursive descent lexer