From 071f4e40f19b23e83e7b16ca9272d5a3ca1806df Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 28 Oct 2020 12:34:11 -0700 Subject: [PATCH] Fix generate error when there are aliases in unused rules --- cli/src/generate/render.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/cli/src/generate/render.rs b/cli/src/generate/render.rs index e1e75ee1..04f9e47b 100644 --- a/cli/src/generate/render.rs +++ b/cli/src/generate/render.rs @@ -519,7 +519,7 @@ impl Generator { } fn add_non_terminal_alias_map(&mut self) { - let mut aliases_by_symbol = HashMap::new(); + let mut alias_ids_by_symbol = HashMap::new(); for variable in &self.syntax_grammar.variables { for production in &variable.productions { for step in &production.steps { @@ -528,10 +528,13 @@ impl Generator { && Some(alias) != self.default_aliases.get(&step.symbol) { if self.symbol_ids.contains_key(&step.symbol) { - let alias_ids = - aliases_by_symbol.entry(step.symbol).or_insert(Vec::new()); - if let Err(i) = alias_ids.binary_search(&alias) { - alias_ids.insert(i, alias); + if let Some(alias_id) = self.alias_ids.get(&alias) { + let alias_ids = alias_ids_by_symbol + .entry(step.symbol) + .or_insert(Vec::new()); + if let Err(i) = alias_ids.binary_search(&alias_id) { + alias_ids.insert(i, alias_id); + } } } } @@ -540,19 +543,19 @@ impl Generator { } } - let mut aliases_by_symbol = aliases_by_symbol.iter().collect::>(); - aliases_by_symbol.sort_unstable_by_key(|e| e.0); + let mut alias_ids_by_symbol = alias_ids_by_symbol.iter().collect::>(); + alias_ids_by_symbol.sort_unstable_by_key(|e| e.0); add_line!(self, "static uint16_t ts_non_terminal_alias_map[] = {{"); indent!(self); - for (symbol, aliases) in aliases_by_symbol { + for (symbol, alias_ids) in alias_ids_by_symbol { let symbol_id = &self.symbol_ids[symbol]; let public_symbol_id = &self.symbol_ids[&self.symbol_map[&symbol]]; - add_line!(self, "{}, {},", symbol_id, 1 + aliases.len()); + add_line!(self, "{}, {},", symbol_id, 1 + alias_ids.len()); indent!(self); add_line!(self, "{},", public_symbol_id); - for alias in aliases { - add_line!(self, "{},", &self.alias_ids[&alias]); + for alias_id in alias_ids { + add_line!(self, "{},", alias_id); } dedent!(self); }