code: def parse_macro_params(token):
      
      try:
          bits = token.split_contents()
          tag_name, macro_name, values = bits[0], bits[1], bits[2:]
      except IndexError:
          raise template.TemplateSyntaxError(
              "{0} tag requires at least one argument (macro name)".format(
                  token.contents.split()[0]))
  
      args = []
      kwargs = {}
  
      # leaving most validation up to the template.Variable
      # class, but use regex here so that validation could
      # be added in future if necessary.
      kwarg_regex = (
          r'^([A-Za-z_][\w_]*)=(".*"|{0}.*{0}|[A-Za-z_][\w_]*)$'.format(
              "'"))
      arg_regex = r'^([A-Za-z_][\w_]*|".*"|{0}.*{0}|(\d+))$'.format(
          "'")
      for value in values:
          # must check against the kwarg regex first
          # because the arg regex matches everything!
          kwarg_match = regex_match(
              kwarg_regex, value)
          if kwarg_match:
              kwargs[kwarg_match.groups()[0]] = template.Variable(
                  # convert to a template variable here
                  kwarg_match.groups()[1])
          else:
              arg_match = regex_match(
                  arg_regex, value)
              if arg_match:
                  args.append(template.Variable(arg_match.groups()[0]))
              else:
                  raise template.TemplateSyntaxError(
                      "Malformed arguments to the {0} tag.".format(
                          tag_name))
  
      return tag_name, macro_name, args, kwargs
docs: Common parsing logic for both use_macro and macro_block