This commit is contained in:
Amaan Qureshi 2024-09-26 17:51:46 -04:00
parent e04387258b
commit 1a99bfd9ff
No known key found for this signature in database
GPG key ID: E67890ADC4227273
6 changed files with 891 additions and 710 deletions

View file

@ -206,12 +206,18 @@ static bool ts_parser__breakdown_top_of_stack(
}
ts_subtree_retain(child);
ts_stack_push(self->stack, slice.version, child, pending, state);
ts_stack_push(self->stack, slice.version, child, pending, state, self->language);
LOG("push 1");
printf("push 1\n");
LOG_STACK();
}
for (uint32_t j = 1; j < slice.subtrees.size; j++) {
Subtree tree = slice.subtrees.contents[j];
ts_stack_push(self->stack, slice.version, tree, false, state);
ts_stack_push(self->stack, slice.version, tree, false, state, self->language);
LOG("push 2");
printf("push 2\n");
LOG_STACK();
}
ts_subtree_release(&self->tree_pool, parent);
@ -913,7 +919,10 @@ static void ts_parser__shift(
subtree_to_push = ts_subtree_from_mut(result);
}
ts_stack_push(self->stack, version, subtree_to_push, !is_leaf, state);
ts_stack_push(self->stack, version, subtree_to_push, !is_leaf, state, self->language);
LOG("push 3");
printf("push 3\n");
LOG_STACK();
if (ts_subtree_has_external_tokens(subtree_to_push)) {
ts_stack_set_last_external_token(
self->stack, version, ts_subtree_last_external_token(subtree_to_push)
@ -1016,9 +1025,15 @@ static StackVersion ts_parser__reduce(
// Push the parent node onto the stack, along with any extra tokens that
// were previously on top of the stack.
ts_stack_push(self->stack, slice_version, ts_subtree_from_mut(parent), false, next_state);
ts_stack_push(self->stack, slice_version, ts_subtree_from_mut(parent), false, next_state, self->language);
LOG("push 4");
printf("push 4\n");
LOG_STACK();
for (uint32_t j = 0; j < self->trailing_extras.size; j++) {
ts_stack_push(self->stack, slice_version, self->trailing_extras.contents[j], false, next_state);
ts_stack_push(self->stack, slice_version, self->trailing_extras.contents[j], false, next_state, self->language);
LOG("push 5");
printf("push 5\n");
LOG_STACK();
}
for (StackVersion j = 0; j < slice_version; j++) {
@ -1042,9 +1057,15 @@ static void ts_parser__accept(
Subtree lookahead
) {
assert(ts_subtree_is_eof(lookahead));
ts_stack_push(self->stack, version, lookahead, false, 1);
ts_stack_push(self->stack, version, lookahead, false, 1, self->language);
LOG("push 6");
printf("push 6\n");
LOG_STACK();
StackSliceArray pop = ts_stack_pop_all(self->stack, version);
LOG("POP ALL")
printf("POP ALL\n");
StackSliceArray pop = ts_stack_pop_all(self->stack, version, self->dot_graph_file);
LOG_STACK();
for (uint32_t i = 0; i < pop.size; i++) {
SubtreeArray trees = pop.contents[i].subtrees;
@ -1222,14 +1243,20 @@ static bool ts_parser__recover_to_state(
if (slice.subtrees.size > 0) {
Subtree error = ts_subtree_new_error_node(&slice.subtrees, true, self->language);
ts_stack_push(self->stack, slice.version, error, false, goal_state);
ts_stack_push(self->stack, slice.version, error, false, goal_state, self->language);
LOG("push 7");
printf("push 7\n");
LOG_STACK();
} else {
array_delete(&slice.subtrees);
}
for (unsigned j = 0; j < self->trailing_extras.size; j++) {
Subtree tree = self->trailing_extras.contents[j];
ts_stack_push(self->stack, slice.version, tree, false, goal_state);
ts_stack_push(self->stack, slice.version, tree, false, goal_state, self->language);
LOG("push 8");
printf("push 8\n");
LOG_STACK();
}
previous_version = slice.version;
@ -1339,7 +1366,10 @@ static void ts_parser__recover(
LOG("recover_eof");
SubtreeArray children = array_new();
Subtree parent = ts_subtree_new_error_node(&children, false, self->language);
ts_stack_push(self->stack, version, parent, false, 1);
ts_stack_push(self->stack, version, parent, false, 1, self->language);
LOG("push 9");
printf("push 9\n");
LOG_STACK();
ts_parser__accept(self, version, lookahead);
return;
}
@ -1407,7 +1437,10 @@ static void ts_parser__recover(
}
// Push the new ERROR onto the stack.
ts_stack_push(self->stack, version, ts_subtree_from_mut(error_repeat), false, ERROR_STATE);
ts_stack_push(self->stack, version, ts_subtree_from_mut(error_repeat), false, ERROR_STATE, self->language);
LOG("push 10");
printf("push 10\n");
LOG_STACK();
if (ts_subtree_has_external_tokens(lookahead)) {
ts_stack_set_last_external_token(
self->stack, version, ts_subtree_last_external_token(lookahead)
@ -1469,8 +1502,11 @@ static void ts_parser__handle_error(
ts_stack_push(
self->stack, version_with_missing_tree,
missing_tree, false,
state_after_missing_symbol
state_after_missing_symbol, self->language
);
LOG("push 11");
printf("push 11\n");
LOG_STACK();
if (ts_parser__do_all_potential_reductions(
self, version_with_missing_tree,
@ -1488,7 +1524,10 @@ static void ts_parser__handle_error(
}
}
ts_stack_push(self->stack, v, NULL_SUBTREE, false, ERROR_STATE);
ts_stack_push(self->stack, v, NULL_SUBTREE, false, ERROR_STATE, self->language);
LOG("push 12");
printf("push 12\n");
LOG_STACK();
v = (v == version) ? previous_version_count : v + 1;
}
@ -1847,7 +1886,7 @@ TSParser *ts_parser_new(void) {
array_init(&self->reduce_actions);
array_reserve(&self->reduce_actions, 4);
self->tree_pool = ts_subtree_pool_new(32);
self->stack = ts_stack_new(&self->tree_pool);
self->stack = ts_stack_new(&self->tree_pool, self->language);
self->finished_tree = NULL_SUBTREE;
self->reusable_node = reusable_node_new();
self->dot_graph_file = NULL;
@ -1915,6 +1954,8 @@ bool ts_parser_set_language(TSParser *self, const TSLanguage *language) {
}
self->language = ts_language_copy(language);
ts_stack_set_language(self->stack, ts_language_copy(language));
ts_stack_set_lexer(self->stack, &self->lexer);
return true;
}