Fix minor differences in generated C code

This commit is contained in:
Max Brunsfeld 2019-01-04 11:19:53 -08:00
parent d845b81ee9
commit 79b9d5ebed
3 changed files with 16 additions and 18 deletions

View file

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

View file

@ -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'"),

View file

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