code: def _input_parser_generator(self):
          
          prefix = ''
          retry = False
          flush = False
  
          while True:
              flush = False
  
              if retry:
                  retry = False
              else:
                  # Get next character.
                  c = yield
  
                  if c == _Flush:
                      flush = True
                  else:
                      prefix += c
  
              # If we have some data, check for matches.
              if prefix:
                  is_prefix_of_longer_match = _IS_PREFIX_OF_LONGER_MATCH_CACHE[prefix]
                  match = self._get_match(prefix)
  
                  # Exact matches found, call handlers..
                  if (flush or not is_prefix_of_longer_match) and match:
                      self._call_handler(match, prefix)
                      prefix = ''
  
                  # No exact match found.
                  elif (flush or not is_prefix_of_longer_match) and not match:
                      found = False
                      retry = True
  
                      # Loop over the input, try the longest match first and
                      # shift.
                      for i in range(len(prefix), 0, -1):
                          match= self._get_match(prefix[:i])
                          if match:
                              self._call_handler(match, prefix[:i])
                              prefix = prefix[i:]
                              found = True
  
                      if not found:
                          self._call_handler(prefix[0], prefix[0])
                          prefix = prefix[1:]
docs: Coroutine (state machine) for the input parser.