lexer now outputs generic token object