diff --git a/lib/lrama/states_reporter.rb b/lib/lrama/states_reporter.rb index eb780711..b3b091e9 100644 --- a/lib/lrama/states_reporter.rb +++ b/lib/lrama/states_reporter.rb @@ -25,39 +25,25 @@ def _report(io, grammar: false, rules: false, terms: false, states: false, items end def report_unused_terms(io) - io << "Unused Terms\n\n" - - results = [] - terms = [] - used_symbols = [] - - terms = @states.symbols.select(&:term?) - - @states.states.select do |state| - state.shifts.map(&:next_sym) - end - - @states.states.each do |state| - state.reduces.select do |reduce| - used_symbols << reduce.look_ahead.flatten if !reduce.look_ahead.nil? + look_aheads = @states.states.each do |state| + state.reduces.flat_map do |reduce| + reduce.look_ahead unless reduce.look_ahead.nil? end end - @states.states.each do |state| - used_symbols << state.shifts.map(&:next_sym).select(&:term?).flatten + next_terms = @states.states.flat_map do |state| + state.shifts.map(&:next_sym).select(&:term?) end - used_symbols = used_symbols.flatten - - results = terms.select do |term| - !used_symbols.include?(term) + unused_symbols = @states.terms.select do |term| + !(look_aheads + next_terms).include?(term) end - results.each_with_index do |term, index| - io << sprintf("%5d %s\n", index, term.id.s_value) - end - - if !results.empty? + unless unused_symbols.empty? + io << "#{unused_symbols.count} Unused Terms\n\n" + unused_symbols.each_with_index do |term, index| + io << sprintf("%5d %s\n", index, term.id.s_value) + end io << "\n\n" end end diff --git a/spec/lrama/states_spec.rb b/spec/lrama/states_spec.rb index c43c7f03..0d7b115e 100644 --- a/spec/lrama/states_spec.rb +++ b/spec/lrama/states_spec.rb @@ -23,7 +23,7 @@ 0 unused - Unused Terms + 11 Unused Terms 0 YYerror 1 YYUNDEF