From 79b9d5ebed3470195e05b50d3f0b42b21cb7c69b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 4 Jan 2019 11:19:53 -0800 Subject: [PATCH] Fix minor differences in generated C code --- src/build_tables/build_parse_table.rs | 12 ++++++------ src/render/mod.rs | 20 +++++++++----------- src/rules.rs | 2 +- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/build_tables/build_parse_table.rs b/src/build_tables/build_parse_table.rs index 9bccf238..5fc015af 100644 --- a/src/build_tables/build_parse_table.rs +++ b/src/build_tables/build_parse_table.rs @@ -531,7 +531,6 @@ impl<'a> ParseTableBuilder<'a> { } fn populate_used_symbols(&mut self) { - self.parse_table.symbols.push(Symbol::end()); let mut terminal_usages = vec![false; self.lexical_grammar.variables.len()]; let mut non_terminal_usages = vec![false; self.syntax_grammar.variables.len()]; let mut external_usages = vec![false; self.syntax_grammar.external_tokens.len()]; @@ -547,16 +546,17 @@ impl<'a> ParseTableBuilder<'a> { non_terminal_usages[symbol.index] = true; } } - for (i, value) in terminal_usages.into_iter().enumerate() { - if value { - self.parse_table.symbols.push(Symbol::terminal(i)); - } - } for (i, value) in external_usages.into_iter().enumerate() { if value { self.parse_table.symbols.push(Symbol::external(i)); } } + self.parse_table.symbols.push(Symbol::end()); + for (i, value) in terminal_usages.into_iter().enumerate() { + if value { + self.parse_table.symbols.push(Symbol::terminal(i)); + } + } for (i, value) in non_terminal_usages.into_iter().enumerate() { if value { self.parse_table.symbols.push(Symbol::non_terminal(i)); diff --git a/src/render/mod.rs b/src/render/mod.rs index 0c0e6e59..61c167bb 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -232,15 +232,13 @@ impl Generator { add_line!(self, "static const char *ts_symbol_names[] = {{"); indent!(self); for symbol in self.parse_table.symbols.iter() { - if *symbol != Symbol::end() { - let name = self.sanitize_string( - self.simple_aliases - .get(symbol) - .map(|alias| alias.value.as_str()) - .unwrap_or(self.metadata_for_symbol(*symbol).0), - ); - add_line!(self, "[{}] = \"{}\",", self.symbol_ids[&symbol], name); - } + let name = self.sanitize_string( + self.simple_aliases + .get(symbol) + .map(|alias| alias.value.as_str()) + .unwrap_or(self.metadata_for_symbol(*symbol).0), + ); + add_line!(self, "[{}] = \"{}\",", self.symbol_ids[&symbol], name); } for (alias, symbol) in &self.alias_map { if symbol.is_none() { @@ -864,7 +862,7 @@ impl Generator { fn metadata_for_symbol(&self, symbol: Symbol) -> (&str, VariableType) { match symbol.kind { - SymbolType::End => ("end", VariableType::Auxiliary), + SymbolType::End => ("end", VariableType::Hidden), SymbolType::NonTerminal => { let variable = &self.syntax_grammar.variables[symbol.index]; (&variable.name, variable.kind) @@ -950,7 +948,7 @@ impl Generator { fn add_character(&mut self, c: char) { if c.is_ascii() { match c { - '\0' => add!(self, "'\\0'"), + '\0' => add!(self, "0"), '\'' => add!(self, "'\\''"), '\\' => add!(self, "'\\\\'"), '\t' => add!(self, "'\\t'"), diff --git a/src/rules.rs b/src/rules.rs index bd0340fc..e15070ea 100644 --- a/src/rules.rs +++ b/src/rules.rs @@ -3,9 +3,9 @@ use hashbrown::HashMap; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub(crate) enum SymbolType { External, + End, Terminal, NonTerminal, - End, } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]