diff --git a/lark/lark.py b/lark/lark.py index 2bf328a..bc34eb4 100644 --- a/lark/lark.py +++ b/lark/lark.py @@ -468,8 +468,18 @@ class Lark(Serialize): raise while True: + if isinstance(e, UnexpectedCharacters): + s = e.puppet.lexer_state.state + p = s.line_ctr.char_pos + if not on_error(e): raise e + + if isinstance(e, UnexpectedCharacters): + # If user didn't change the character position, then we should + if p == s.line_ctr.char_pos: + s.line_ctr.feed(s.text[p:p+1]) + try: return e.puppet.resume_parse() except UnexpectedToken as e2: diff --git a/lark/parsers/lalr_parser.py b/lark/parsers/lalr_parser.py index e5bb2a1..63e7119 100644 --- a/lark/parsers/lalr_parser.py +++ b/lark/parsers/lalr_parser.py @@ -134,10 +134,6 @@ class _Parser: e.puppet = ParserPuppet(self, state, state.lexer) except NameError: pass - if isinstance(e, UnexpectedCharacters): - s = state.lexer.state - p = s.line_ctr.char_pos - s.line_ctr.feed(s.text[p:p+1]) raise e except Exception as e: if self.debug: