diff --git a/src/runtime/language.c b/src/runtime/language.c index ef57aa16..9d6f2f83 100644 --- a/src/runtime/language.c +++ b/src/runtime/language.c @@ -10,8 +10,12 @@ const TSParseAction *ts_language_actions(const TSLanguage *self, TSStateId state TSSymbol symbol, size_t *count) { if (state == ts_parse_state_error) { *count = 1; - return (symbol == ts_builtin_sym_error) ? &ERROR_SHIFT_EXTRA - : &self->recovery_actions[symbol]; + if (symbol == ts_builtin_sym_error) + return &ERROR_SHIFT_EXTRA; + else if (self->recovery_actions[symbol].type == TSParseActionTypeError) + return &ERROR_SHIFT_EXTRA; + else + return &self->recovery_actions[symbol]; } size_t action_index = 0; diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 14fa2af3..ed203fd2 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -122,7 +122,7 @@ static BreakdownResult ts_parser__breakdown_top_of_stack(TSParser *self, } else if (!last_child->extra) { TSParseAction action = ts_language_last_action(self->language, state, last_child->symbol); - assert(action.type == TSParseActionTypeShift); + assert(action.type == TSParseActionTypeShift || action.type == TSParseActionTypeRecover); state = action.data.to_state; } @@ -415,7 +415,7 @@ static Reduction ts_parser__reduce(TSParser *self, StackVersion version, } TSStateId state = ts_stack_top_state(self->stack, slice.version); - if (fragile || self->is_split || ts_stack_version_count(self->stack) > 1) { + if (fragile || self->is_split || initial_version_count > 1) { parent->fragile_left = true; parent->fragile_right = true; parent->parse_state = TS_TREE_STATE_ERROR;