code: def parse_tag(tag):
      
      tag = normalize_characters(tag)
      if tag in EXCEPTIONS:
          return [('grandfathered', tag)]
      else:
          # The first subtag is always either the language code, or 'x' to mark
          # the entire tag as private-use. Other subtags are distinguished
          # by their length and format, but the language code is distinguished
          # entirely by the fact that it is required to come first.
          subtags = tag.split('-')
          if subtags[0] == 'x':
              if len(subtags) == 1:
                  raise LanguageTagError("'x' is not a language tag on its own")
              else:
                  # the entire language tag is private use, but we know that,
                  # whatever it is, it fills the "language" slot
                  return [('language', tag)]
          elif len(subtags[0]) >= 2:
              return [('language', subtags[0])] + parse_subtags(subtags[1:])
          else:
              subtag_error(subtags[0], 'a language code')
docs: Parse the syntax of a language tag, without looking up anything in the
      registry, yet. Returns a list of (type, value) tuples indicating what
      information will need to be looked up.