tokens can be empty list