@abstractmethod<EOL><INDENT>def find_all_matching_parsers(self, strict: bool, desired_type: Type[Any] = JOKER, required_ext: str = JOKER)-> Tuple[List[Parser], List[Parser], List[Parser], List[Parser]]:<DEDENT>
pass<EOL>
Main method to find parsers matching a query. Its first output is made of three lists without duplicates:
- first the generic ones, from first registered to last registered
- then the specific ones approximately matching the required type (from first registered to last reg)
- then the specific ones, from first registered to last registered
each list should be ordered from less relevant (first) to most relevant (last).

This function also outputs 3 other lists that correspond to parsers that don't match the query:
- the list of parsers matching the type but not the extension
- the list of parsers matching the extension but not the type,
- the list of remaining parsers (no match at all)

WARNING: the order of parsers in lists is the opposite of the order in get_capabilities_for_type and
get_capabilities_for_ext methods

:param strict:
:param desired_type: a type of object to parse, or JOKER for 'wildcard'(*) .
WARNING: "object_type=AnyObject/object/Any)"
means "all parsers able to parse anything", which is different from "object_type=JOKER" which means "all parsers".
:param required_ext: a specific extension to parse, or JOKER for 'wildcard'(*)
:return: a tuple: [matching parsers(*), parsers matching type but not ext, parsers matching ext but not type,
parsers not matching at all]. (*) matching parsers is actually a tuple : (matching_parsers_generic,
matching_parsers_approx, matching_parsers_exact), each list from less relevant to most relevant.