code: def count_tokens(tokens, to_lower=False, counter=None):
      r
      if to_lower:
          tokens = [t.lower() for t in tokens]
  
      if counter is None:
          return Counter(tokens)
      else:
          counter.update(tokens)
          return counter
docs: r"""Counts tokens in the specified string.
  
      For token_delim='(td)' and seq_delim='(sd)', a specified string of two sequences of tokens may
      look like::
  
          (td)token1(td)token2(td)token3(td)(sd)(td)token4(td)token5(td)(sd)
  
  
      Parameters
      ----------
      tokens : list of str
          A source list of tokens.
      to_lower : bool, default False
          Whether to convert the source source_str to the lower case.
      counter : Counter or None, default None
          The Counter instance to be updated with the counts of `tokens`. If
          None, return a new Counter instance counting tokens from `tokens`.
  
      Returns
      -------
      The `counter` Counter instance after being updated with the token
      counts of `source_str`. If `counter` is None, return a new Counter
      instance counting tokens from `source_str`.
  
      Examples
      --------
      >>> import re
      >>> source_str = ' Life is great ! \n life is good . \n'
      >>> source_str_tokens = filter(None, re.split(' |\n', source_str))
      >>> gluonnlp.data.count_tokens(source_str_tokens)
      Counter({'is': 2, 'Life': 1, 'great': 1, '!': 1, 'life': 1, 'good': 1, '.': 1})