From 71059f1d66ebd66aea7b64c77eb0b74a1076036b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 15 Dec 2015 22:26:42 -0800 Subject: [PATCH] Don't reuse fragile tokens across different parse stack heads --- src/runtime/parser.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/runtime/parser.c b/src/runtime/parser.c index d5574152..9081fdb0 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -115,7 +115,7 @@ static void ts_parser__pop_reusable_subtree(LookaheadState *state) { } static bool ts_parser__can_reuse(TSParser *self, int head, TSTree *subtree) { - if (!subtree || subtree->symbol == ts_builtin_sym_error) + if (!subtree || subtree->symbol == ts_builtin_sym_error || ts_tree_is_fragile(subtree)) return false; TSStateId state = ts_stack_top_state(self->stack, head); const TSParseAction *action = @@ -151,15 +151,11 @@ static TSTree *ts_parser__get_next_lookahead(TSParser *self, int head) { } LOG("breakdown_changed sym:%s", SYM_NAME(state->reusable_subtree->symbol)); can_reuse = false; - } else if (ts_tree_is_fragile(state->reusable_subtree)) { - LOG("breakdown_fragile sym:%s", SYM_NAME(state->reusable_subtree->symbol)); - can_reuse = false; } else if (ts_tree_is_extra(state->reusable_subtree)) { LOG("breakdown_extra sym:%s", SYM_NAME(state->reusable_subtree->symbol)); can_reuse = false; - } else if (state->reusable_subtree->child_count > 0 && - !ts_parser__can_reuse(self, head, state->reusable_subtree)) { - LOG("breakdown_unexpected sym:%s", SYM_NAME(state->reusable_subtree->symbol)); + } else if (!ts_parser__can_reuse(self, head, state->reusable_subtree)) { + LOG("breakdown_non_reusable sym:%s", SYM_NAME(state->reusable_subtree->symbol)); can_reuse = false; }