Merge all versions created in a given reduce operation
This commit is contained in:
parent
fe74c6fb34
commit
e99a3925e0
3 changed files with 12 additions and 3 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue