docs: def ParsePath(path,
                opts = None):
    """Parses given path into a stream of `PathComponent` instances.
  
    Args:
      path: A path to be parsed.
      opts: An `PathOpts` object.
  
    Yields:
      `PathComponent` instances corresponding to the components of the given path.
  
    Raises:
      ValueError: If path contains more than one recursive component.
    """
    precondition.AssertType(path, Text)
  
    rcount = 0
  
    # Split the path at all forward slashes and if running under Windows, also
    # backward slashes. This allows ParsePath to handle native paths and also
    # normalized VFS paths like /HKEY_LOCAL_MACHINE/SAM.
    normalized_path = path.replace(os.path.sep, "/")
  
    for item in normalized_path.split("/"):
      component = ParsePathItem(item, opts=opts)
      if isinstance(component, RecursiveComponent):
        rcount += 1
        if rcount > 1:
          raise ValueError("path cannot have more than one recursive component")
      yield component