From 2b0de9dfec62af7e74c319abe80912b02dca74be Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 1 Feb 2021 13:29:58 -0800 Subject: [PATCH] Fix small bugs in conflict reporting * Negative precedence values were not displayed * Rule names were repeated in resolution suggestions --- .../build_tables/build_parse_table.rs | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/cli/src/generate/build_tables/build_parse_table.rs b/cli/src/generate/build_tables/build_parse_table.rs index c63701ee..bfb01736 100644 --- a/cli/src/generate/build_tables/build_parse_table.rs +++ b/cli/src/generate/build_tables/build_parse_table.rs @@ -577,7 +577,7 @@ impl<'a> ParseTableBuilder<'a> { "(precedence: {}, associativity: {:?})", precedence, associativity )) - } else if precedence > 0 { + } else if precedence != 0 { Some(format!("(precedence: {})", precedence)) } else { None @@ -619,6 +619,28 @@ impl<'a> ParseTableBuilder<'a> { } shift_items.sort_unstable(); reduce_items.sort_unstable(); + + let list_rule_names = |mut msg: &mut String, items: &[&ParseItem]| { + let mut last_rule_id = None; + for item in items { + if last_rule_id == Some(item.variable_index) { + continue; + } + + if last_rule_id.is_some() { + write!(&mut msg, " and").unwrap(); + } + + last_rule_id = Some(item.variable_index); + write!( + msg, + " `{}`", + self.symbol_name(&Symbol::non_terminal(item.variable_index as usize)) + ) + .unwrap(); + } + }; + if actual_conflict.len() > 1 { if shift_items.len() > 0 { resolution_count += 1; @@ -628,17 +650,7 @@ impl<'a> ParseTableBuilder<'a> { resolution_count ) .unwrap(); - for (i, item) in shift_items.iter().enumerate() { - if i > 0 { - write!(&mut msg, " and").unwrap(); - } - write!( - &mut msg, - " `{}`", - self.symbol_name(&Symbol::non_terminal(item.variable_index as usize)) - ) - .unwrap(); - } + list_rule_names(&mut msg, &shift_items); write!(&mut msg, " than in the other rules.\n").unwrap(); } @@ -658,21 +670,11 @@ impl<'a> ParseTableBuilder<'a> { resolution_count += 1; write!( &mut msg, - " {}: Specify a left or right associativity in ", + " {}: Specify a left or right associativity in", resolution_count ) .unwrap(); - for (i, item) in reduce_items.iter().enumerate() { - if i > 0 { - write!(&mut msg, " and ").unwrap(); - } - write!( - &mut msg, - "`{}`", - self.symbol_name(&Symbol::non_terminal(item.variable_index as usize)) - ) - .unwrap(); - } + list_rule_names(&mut msg, &reduce_items); write!(&mut msg, "\n").unwrap(); }