diff --git a/src/compiler/build_tables/build_parse_table.cc b/src/compiler/build_tables/build_parse_table.cc index 9175cc4a..c874b8bb 100644 --- a/src/compiler/build_tables/build_parse_table.cc +++ b/src/compiler/build_tables/build_parse_table.cc @@ -699,15 +699,21 @@ class ParseTableBuilder { } unsigned get_rename_sequence_id(const Production &production) { + bool has_rename = false; RenameSequence rename_sequence; for (unsigned i = 0, n = production.size(); i < n; i++) { auto &step = production.at(i); if (!step.name_replacement.empty()) { - rename_sequence.resize(production.size()); + has_rename = true; + rename_sequence.resize(i + 1); rename_sequence[i] = step.name_replacement; } } + if (has_rename && production.size() > parse_table.max_rename_sequence_length) { + parse_table.max_rename_sequence_length = production.size(); + } + auto begin = parse_table.rename_sequences.begin(); auto end = parse_table.rename_sequences.end(); auto iter = find(begin, end, rename_sequence); diff --git a/src/compiler/generate_code/c_code.cc b/src/compiler/generate_code/c_code.cc index 25f8934f..95feb03b 100644 --- a/src/compiler/generate_code/c_code.cc +++ b/src/compiler/generate_code/c_code.cc @@ -141,11 +141,7 @@ class CCodeGenerator { } } - unsigned max_rename_sequence_length = 0; for (const RenameSequence &rename_sequence : parse_table.rename_sequences) { - if (rename_sequence.size() > max_rename_sequence_length) { - max_rename_sequence_length = rename_sequence.size(); - } for (const string &name_replacement : rename_sequence) { if (!name_replacement.empty()) { unique_replacement_names.insert(name_replacement); @@ -159,7 +155,7 @@ class CCodeGenerator { line("#define RENAME_SYMBOL_COUNT " + to_string(unique_replacement_names.size())); line("#define TOKEN_COUNT " + to_string(token_count)); line("#define EXTERNAL_TOKEN_COUNT " + to_string(syntax_grammar.external_tokens.size())); - line("#define MAX_RENAME_SEQUENCE_LENGTH " + to_string(max_rename_sequence_length)); + line("#define MAX_RENAME_SEQUENCE_LENGTH " + to_string(parse_table.max_rename_sequence_length)); line(); } diff --git a/src/compiler/parse_table.h b/src/compiler/parse_table.h index 6642e325..cf9b5b9a 100644 --- a/src/compiler/parse_table.h +++ b/src/compiler/parse_table.h @@ -83,6 +83,7 @@ struct ParseTable { std::vector states; std::map symbols; std::vector rename_sequences; + unsigned max_rename_sequence_length = 0; }; } // namespace tree_sitter