code: def parse(input, identifier: str = None, use_cache=False, clear_cache=True, pattern="*.qface", profile=EProfile.FULL):
          
          inputs = input if isinstance(input, (list, tuple)) else [input]
          logger.debug('parse input={0}'.format(inputs))
          identifier = 'system' if not identifier else identifier
          system = System()
          cache = None
          if use_cache:
              cache = shelve.open('qface.cache')
              if identifier in cache and clear_cache:
                  del cache[identifier]
              if identifier in cache:
                  # use the cached domain model
                  system = cache[identifier]
          # if domain model not cached generate it
          for input in inputs:
              path = Path.getcwd() / str(input)
              if path.isfile():
                  FileSystem.parse_document(path, system)
              else:
                  for document in path.walkfiles(pattern):
                      FileSystem.parse_document(document, system)
  
          if use_cache:
              cache[identifier] = system
          return system
docs: Input can be either a file or directory or a list of files or directory.
          A directory will be parsed recursively. The function returns the resulting system.
          Stores the result of the run in the domain cache named after the identifier.
  
          :param path: directory to parse
          :param identifier: identifies the parse run. Used to name the cache
          :param clear_cache: clears the domain cache (defaults to true)