code: def _lex(stream):
      
      lines = enumerate(stream, 1)
      line_no = pos = 0
      try:
          while True:
              if pos == 0:
                  line_no, line = next(lines)
              matches = _tdl_lex_re.finditer(line, pos)
              pos = 0  # reset; only used for multiline patterns
              for m in matches:
                  gid = m.lastindex
                  if gid <= 2:  # potentially multiline patterns
                      if gid == 1:  # docstring
                          s, start_line_no, line_no, line, pos = _bounded(
                              '"""', '"""', line, m.end(), line_no, lines)
                      elif gid == 2:  # comment
                          s, start_line_no, line_no, line, pos = _bounded(
                              '#|', '|#', line, m.end(), line_no, lines)
                      yield (gid, s, line_no)
                      break
                  elif gid == 30:
                      raise TdlParsingError(
                          ('Syntax error:\n  {}\n {}^'
                           .format(line, ' ' * m.start())),
                          line_number=line_no)
                  else:
                      # token = None
                      # if not (6 < gid < 20):
                      #     token = m.group(gid)
                      token = m.group(gid)
                      yield (gid, token, line_no)
      except StopIteration:
          pass
docs: Lex the input stream according to _tdl_lex_re.
  
      Yields
          (gid, token, line_number)