docs: def _parseExpressionTerm(self, src):
          """term
          : unary_operator?
              [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* |
              TIME S* | FREQ S* | function ]
          | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor
          ;
          """
          ctxsrc = src
  
          result, src = self._getMatchResult(self.re_num, src)
          if result is not None:
              units, src = self._getMatchResult(self.re_unit, src)
              term = self.cssBuilder.termNumber(result, units)
              return src.lstrip(), term
  
          result, src = self._getString(src, self.re_uri)
          if result is not None:
              # XXX URL!!!!
              term = self.cssBuilder.termURI(result)
              return src.lstrip(), term
  
          result, src = self._getString(src)
          if result is not None:
              term = self.cssBuilder.termString(result)
              return src.lstrip(), term
  
          result, src = self._getMatchResult(self.re_functionterm, src)
          if result is not None:
              src, params = self._parseExpression(src, True)
              if src[0] != ')':
                  raise self.ParseError('Terminal function expression expected closing \')\'', src, ctxsrc)
              src = src[1:].lstrip()
              term = self.cssBuilder.termFunction(result, params)
              return src, term
  
          result, src = self._getMatchResult(self.re_rgbcolor, src)
          if result is not None:
              term = self.cssBuilder.termRGB(result)
              return src.lstrip(), term
  
          result, src = self._getMatchResult(self.re_unicoderange, src)
          if result is not None:
              term = self.cssBuilder.termUnicodeRange(result)
              return src.lstrip(), term
  
          nsPrefix, src = self._getMatchResult(self.re_namespace_selector, src)
          result, src = self._getIdent(src)
          if result is not None:
              if nsPrefix is not None:
                  result = self.cssBuilder.resolveNamespacePrefix(nsPrefix, result)
              term = self.cssBuilder.termIdent(result)
              return src.lstrip(), term
  
          result, src = self._getMatchResult(self.re_unicodeid, src)
          if result is not None:
              term = self.cssBuilder.termIdent(result)
              return src.lstrip(), term
  
          result, src = self._getMatchResult(self.re_unicodestr, src)
          if result is not None:
              term = self.cssBuilder.termString(result)
              return src.lstrip(), term
  
          return self.cssBuilder.termUnknown(src)