@@ -242,37 +242,67 @@ static bool parser__condense_stack(Parser *self) {
242242 return result ;
243243}
244244
245- static TSTree * parser__lex (Parser * self , TSStateId parse_state , bool error_mode ) {
246- TSStateId state = self -> language -> lex_states [parse_state ];
247- LOG ("lex state:%d" , state );
245+ static TSTree * parser__lex (Parser * self , TSStateId parse_state ) {
246+ TSStateId start_state = self -> language -> lex_states [parse_state ];
247+ TSStateId current_state = start_state ;
248+ TSLength start_position = self -> lexer .current_position ;
249+ TSLength position = start_position ;
250+ LOG ("lex state:%d" , start_state );
251+
252+ bool skipped_error = false;
253+ int32_t first_error_character = 0 ;
254+ TSLength error_start_position , error_end_position ;
255+
256+ ts_lexer_start (& self -> lexer , start_state );
257+
258+ while (!self -> language -> lex_fn (& self -> lexer , current_state )) {
259+ if (current_state != TS_STATE_ERROR ) {
260+ LOG ("retry_in_error_mode" );
261+ ts_lexer_reset (& self -> lexer , position );
262+ ts_lexer_start (& self -> lexer , start_state );
263+ current_state = TS_STATE_ERROR ;
264+ continue ;
265+ }
248266
249- TSLength position = self -> lexer .current_position ;
267+ if (self -> lexer .lookahead == 0 ) {
268+ self -> lexer .result_symbol = ts_builtin_sym_error ;
269+ break ;
270+ }
250271
251- ts_lexer_start (& self -> lexer , state );
252- if (!self -> language -> lex_fn (& self -> lexer , state , error_mode )) {
253- ts_lexer_reset (& self -> lexer , position );
254- ts_lexer_start (& self -> lexer , state );
255- assert (self -> language -> lex_fn (& self -> lexer , TS_STATE_ERROR , true));
256- }
272+ if (self -> lexer .current_position .chars == position .chars ) {
273+ if (!skipped_error ) {
274+ error_start_position = self -> lexer .current_position ;
275+ first_error_character = self -> lexer .lookahead ;
276+ }
277+ skipped_error = true;
278+ self -> lexer .advance (& self -> lexer , TS_STATE_ERROR , false);
279+ error_end_position = self -> lexer .current_position ;
280+ }
257281
258- TSLexerResult lex_result ;
259- ts_lexer_finish ( & self -> lexer , & lex_result );
282+ position = self -> lexer . current_position ;
283+ }
260284
261285 TSTree * result ;
262- if (lex_result .symbol == ts_builtin_sym_error ) {
263- result = ts_tree_make_error (lex_result .size , lex_result .padding ,
264- lex_result .first_unexpected_character );
286+
287+ if (skipped_error ) {
288+ error_start_position = ts_length_min (error_start_position , self -> lexer .token_start_position );
289+ TSLength padding = ts_length_sub (error_start_position , start_position );
290+ TSLength size = ts_length_sub (error_end_position , error_start_position );
291+ ts_lexer_reset (& self -> lexer , error_end_position );
292+ result = ts_tree_make_error (size , padding , first_error_character );
265293 } else {
266- result = ts_tree_make_leaf (
267- lex_result .symbol , lex_result .padding , lex_result .size ,
268- ts_language_symbol_metadata (self -> language , lex_result .symbol ));
269- if (!result )
270- return NULL ;
271- result -> parse_state = parse_state ;
294+ TSSymbol symbol = self -> lexer .result_symbol ;
295+ TSLength padding = ts_length_sub (self -> lexer .token_start_position , start_position );
296+ TSLength size = ts_length_sub (self -> lexer .current_position , self -> lexer .token_start_position );
297+ result = ts_tree_make_leaf (symbol , padding , size ,
298+ ts_language_symbol_metadata (self -> language , symbol ));
272299 }
273300
274- result -> first_leaf .lex_state = state ;
301+ if (!result )
302+ return NULL ;
275303
304+ result -> parse_state = parse_state ;
305+ result -> first_leaf .lex_state = start_state ;
276306 return result ;
277307}
278308
@@ -333,8 +363,7 @@ static TSTree *parser__get_lookahead(Parser *self, StackVersion version,
333363
334364 ts_lexer_reset (& self -> lexer , position );
335365 TSStateId parse_state = ts_stack_top_state (self -> stack , version );
336- bool error_mode = parse_state == TS_STATE_ERROR ;
337- return parser__lex (self , parse_state , error_mode );
366+ return parser__lex (self , parse_state );
338367
339368error :
340369 return NULL ;
0 commit comments