This commit is contained in:
Max Brunsfeld 2017-07-14 10:37:26 -07:00
parent a22386e408
commit 99885788bc

View file

@ -352,7 +352,10 @@ static Tree *parser__lex(Parser *self, StackVersion version) {
if (found_external_token) {
result->has_external_tokens = true;
memset(result->external_token_state, 0, sizeof(TSExternalTokenState));
self->language->external_scanner.serialize(self->external_scanner_payload, result->external_token_state);
self->language->external_scanner.serialize(
self->external_scanner_payload,
result->external_token_state
);
ts_lexer_set_last_external_token(&self->lexer, result);
}
}
@ -537,12 +540,15 @@ static void parser__shift(Parser *self, StackVersion version, TSStateId state,
ts_tree_release(lookahead);
}
static bool parser__switch_children(Parser *self, Tree *tree,
Tree **children, uint32_t count,
const TSSymbol *rename_sequence) {
static bool parser__replace_children(Parser *self, Tree *tree, Tree **children, uint32_t count) {
self->scratch_tree.symbol = tree->symbol;
self->scratch_tree.child_count = 0;
ts_tree_set_children(&self->scratch_tree, count, children, rename_sequence);
ts_tree_set_children(
&self->scratch_tree,
count,
children,
ts_language_rename_sequence(self->language, tree->rename_sequence_id)
);
if (parser__select_tree(self, tree, &self->scratch_tree)) {
tree->size = self->scratch_tree.size;
tree->padding = self->scratch_tree.padding;
@ -558,18 +564,16 @@ static bool parser__switch_children(Parser *self, Tree *tree,
}
static StackPopResult parser__reduce(Parser *self, StackVersion version,
TSSymbol symbol, unsigned count,
int dynamic_precedence, unsigned short rename_sequence_id,
TSSymbol symbol, uint32_t count,
int dynamic_precedence, uint16_t rename_sequence_id,
bool fragile, bool allow_skipping) {
uint32_t initial_version_count = ts_stack_version_count(self->stack);
StackPopResult pop = ts_stack_pop_count(self->stack, version, count);
if (pop.stopped_at_error)
return pop;
if (pop.stopped_at_error) return pop;
const TSLanguage *language = self->language;
TSSymbolMetadata metadata = ts_language_symbol_metadata(language, symbol);
const TSSymbol *rename_sequence = ts_language_rename_sequence(language, rename_sequence_id);
TSSymbolMetadata metadata = ts_language_symbol_metadata(self->language, symbol);
const TSSymbol *rename_sequence = ts_language_rename_sequence(self->language, rename_sequence_id);
for (uint32_t i = 0; i < pop.slices.size; i++) {
StackSlice slice = pop.slices.contents[i];
@ -578,10 +582,13 @@ static StackPopResult parser__reduce(Parser *self, StackVersion version,
// node. They will be re-pushed onto the stack after the parent node is
// created and pushed.
uint32_t child_count = slice.trees.size;
while (child_count > 0 && slice.trees.contents[child_count - 1]->extra)
while (child_count > 0 && slice.trees.contents[child_count - 1]->extra) {
child_count--;
}
Tree *parent = ts_tree_make_node(symbol, child_count, slice.trees.contents, metadata, rename_sequence);
Tree *parent = ts_tree_make_node(
symbol, child_count, slice.trees.contents, metadata, rename_sequence
);
// This pop operation may have caused multiple stack versions to collapse
// into one, because they all diverged from a common state. In that case,
@ -593,10 +600,11 @@ static StackPopResult parser__reduce(Parser *self, StackVersion version,
i++;
uint32_t child_count = next_slice.trees.size;
while (child_count > 0 && next_slice.trees.contents[child_count - 1]->extra)
while (child_count > 0 && next_slice.trees.contents[child_count - 1]->extra) {
child_count--;
}
if (parser__switch_children(self, parent, next_slice.trees.contents, child_count, rename_sequence)) {
if (parser__replace_children(self, parent, next_slice.trees.contents, child_count)) {
ts_tree_array_delete(&slice.trees);
slice = next_slice;
} else {
@ -608,7 +616,7 @@ static StackPopResult parser__reduce(Parser *self, StackVersion version,
parent->rename_sequence_id = rename_sequence_id;
TSStateId state = ts_stack_top_state(self->stack, slice.version);
TSStateId next_state = ts_language_next_state(language, state, symbol);
TSStateId next_state = ts_language_next_state(self->language, state, symbol);
if (fragile || self->is_split || pop.slices.size > 1 || initial_version_count > 1) {
parent->fragile_left = true;
parent->fragile_right = true;