Avoid creating redundant rename sequences

This commit is contained in:
Max Brunsfeld 2017-07-18 14:45:10 -07:00
parent afb499bf2e
commit 4649c3a37f
3 changed files with 9 additions and 6 deletions

View file

@ -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);

View file

@ -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();
}

View file

@ -83,6 +83,7 @@ struct ParseTable {
std::vector<ParseState> states;
std::map<rules::Symbol, ParseTableSymbolMetadata> symbols;
std::vector<RenameSequence> rename_sequences;
unsigned max_rename_sequence_length = 0;
};
} // namespace tree_sitter