diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 17411929..b7c0848d 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -342,6 +342,7 @@ static Reduction ts_parser__reduce(TSParser *self, StackVersion version, count, BOOL_STRING(fragile)); } + size_t initial_version_count = ts_stack_version_count(self->stack); StackPopResult pop = ts_stack_pop_count(self->stack, version, count); switch (pop.status) { case StackPopFailed: @@ -414,6 +415,8 @@ static Reduction ts_parser__reduce(TSParser *self, StackVersion version, } } + ts_stack_merge_from(self->stack, initial_version_count); + return (Reduction){ ReduceSucceeded, pop.slices.contents[0] }; error: diff --git a/src/runtime/stack.c b/src/runtime/stack.c index d780e9e1..56af6de3 100644 --- a/src/runtime/stack.c +++ b/src/runtime/stack.c @@ -401,10 +401,10 @@ void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2) { array_erase(&self->heads, v1); } -void ts_stack_merge(Stack *self) { - for (size_t i = 0; i < self->heads.size; i++) { +void ts_stack_merge_from(Stack *self, StackVersion start_version) { + for (size_t i = start_version + 1; i < self->heads.size; i++) { StackNode *node = self->heads.contents[i]; - for (size_t j = 0; j < i; j++) { + for (size_t j = start_version; j < i; j++) { StackNode *prior_node = self->heads.contents[j]; if (prior_node->state == node->state && prior_node->position.chars == node->position.chars) { @@ -419,6 +419,10 @@ void ts_stack_merge(Stack *self) { } } +void ts_stack_merge(Stack *self) { + ts_stack_merge_from(self, 0); +} + void ts_stack_clear(Stack *self) { stack_node_retain(self->base_node); for (size_t i = 0; i < self->heads.size; i++) diff --git a/src/runtime/stack.h b/src/runtime/stack.h index bf95cc2d..d5761650 100644 --- a/src/runtime/stack.h +++ b/src/runtime/stack.h @@ -94,6 +94,8 @@ StackPopResult ts_stack_pop_pending(Stack *, StackVersion); StackPopResult ts_stack_pop_all(Stack *, StackVersion); +void ts_stack_merge_from(Stack *, StackVersion); + void ts_stack_merge(Stack *); void ts_stack_renumber_version(Stack *, StackVersion, StackVersion);