Class: Lrama::Reporter::Rules

Inherits:
Object
  • Object
show all
Defined in:
lib/lrama/reporter/rules.rb

Instance Method Summary collapse

Constructor Details

#initialize(rules: false, **_) ⇒ Rules

Returns a new instance of Rules.



8
9
10
# File 'lib/lrama/reporter/rules.rb', line 8

def initialize(rules: false, **_)
  @rules = rules
end

Instance Method Details

#report(io, states) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/lrama/reporter/rules.rb', line 13

def report(io, states)
  return unless @rules

  used_rules = states.rules.flat_map(&:rhs)

  unless used_rules.empty?
    io << "Rule Usage Frequency\n\n"
    frequency_counts = used_rules.each_with_object(Hash.new(0)) { |rule, counts| counts[rule] += 1 }

    frequency_counts
      .select { |rule,| !rule.midrule? }
      .sort_by { |rule, count| [-count, rule.name] }
      .each_with_index { |(rule, count), i| io << sprintf("%5d %s (%d times)", i, rule.name, count) << "\n" }
    io << "\n\n"
  end

  unused_rules = states.rules.map(&:lhs).select do |rule|
    !used_rules.include?(rule) && rule.token_id != 0
  end

  unless unused_rules.empty?
    io << "#{unused_rules.count} Unused Rules\n\n"
    unused_rules.each_with_index do |rule, index|
      io << sprintf("%5d %s", index, rule.display_name) << "\n"
    end
    io << "\n\n"
  end
end