diff --git a/src/build_tables/build_parse_table.rs b/src/build_tables/build_parse_table.rs index e642c3cd..7fb668dd 100644 --- a/src/build_tables/build_parse_table.rs +++ b/src/build_tables/build_parse_table.rs @@ -675,6 +675,9 @@ impl<'a> ParseTableBuilder<'a> { while alias_sequence.last() == Some(&None) { alias_sequence.pop(); } + if item.production.steps.len() > self.parse_table.max_aliased_production_length { + self.parse_table.max_aliased_production_length = item.production.steps.len() + } if let Some(index) = self .parse_table .alias_sequences @@ -721,8 +724,9 @@ pub(crate) fn build_parse_table( parse_state_queue: VecDeque::new(), parse_table: ParseTable { states: Vec::new(), - alias_sequences: Vec::new(), symbols: Vec::new(), + alias_sequences: Vec::new(), + max_aliased_production_length: 0, }, following_tokens: vec![LookaheadSet::new(); lexical_grammar.variables.len()], } diff --git a/src/render/mod.rs b/src/render/mod.rs index 58235fd9..8d3ee195 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -191,17 +191,11 @@ impl Generator { "#define EXTERNAL_TOKEN_COUNT {}", self.syntax_grammar.external_tokens.len() ); - if let Some(max_alias_sequence_length) = self - .parse_table - .alias_sequences - .iter() - .map(|seq| seq.len()) - .max() - { + if self.parse_table.max_aliased_production_length > 0 { add_line!( self, "#define MAX_ALIAS_SEQUENCE_LENGTH {}", - max_alias_sequence_length + self.parse_table.max_aliased_production_length ); } add_line!(self, ""); diff --git a/src/tables.rs b/src/tables.rs index c8f7e1e4..edbbaaab 100644 --- a/src/tables.rs +++ b/src/tables.rs @@ -44,6 +44,7 @@ pub(crate) struct ParseTable { pub states: Vec, pub symbols: Vec, pub alias_sequences: Vec>>, + pub max_aliased_production_length: usize, } #[derive(Clone, Debug, PartialEq, Eq)]