diff --git a/lark/exceptions.py b/lark/exceptions.py index 017e504..1c5e533 100644 --- a/lark/exceptions.py +++ b/lark/exceptions.py @@ -32,14 +32,14 @@ class UnexpectedInput(LarkError): after = text[pos:end].split('\n', 1)[0] return before + after + '\n' + ' ' * len(before) + '^\n' - def match_examples(self, parse_fn, examples): + def match_examples(self, parse_fn, examples, token_type_match_fallback=False): """ Given a parser instance and a dictionary mapping some label with some malformed syntax examples, it'll return the label for the example that bests matches the current error. """ assert self.state is not None, "Not supported for this exception" - candidate = None + candidate = (None, False) for label, example in examples.items(): assert not isinstance(example, STRING_TYPE) @@ -51,12 +51,18 @@ class UnexpectedInput(LarkError): try: if ut.token == self.token: # Try exact match first return label + + if token_type_match_fallback: + # Fallback to token types match + if (ut.token.type == self.token.type) and not candidate[-1]: + candidate = label, True + except AttributeError: pass - if not candidate: - candidate = label + if not candidate[0]: + candidate = label, False - return candidate + return candidate[0] class UnexpectedCharacters(LexError, UnexpectedInput):