From 34eb1370ff94035d4e9dbdcf36a6607a587ddfdb Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 4 Jun 2022 17:49:36 -0400 Subject: [PATCH] Move RuleSet::Patern to top-level Rule class --- lib/propane.rb | 5 +++-- lib/propane/parser.rb | 8 ++++---- lib/propane/parser/item.rb | 28 ++++++++++++++-------------- lib/propane/rule.rb | 19 +++++++++++++++++++ lib/propane/rule_set.rb | 24 ++++-------------------- 5 files changed, 44 insertions(+), 40 deletions(-) create mode 100644 lib/propane/rule.rb diff --git a/lib/propane.rb b/lib/propane.rb index 3af051c..1137814 100644 --- a/lib/propane.rb +++ b/lib/propane.rb @@ -14,6 +14,7 @@ require_relative "propane/regex" require_relative "propane/regex/nfa" require_relative "propane/regex/unit" require_relative "propane/rule_set" +require_relative "propane/rule" require_relative "propane/token" require_relative "propane/version" @@ -86,7 +87,7 @@ class Propane rule_name, components, code = $1, $2, $3 components = components.strip.split(/\s+/) @rule_sets[rule_name] ||= RuleSet.new(rule_name, @rule_sets.size) - @rule_sets[rule_name].add_pattern(components, code) + @rule_sets[rule_name].add_rule(components, code) else if input.size > 25 input = input.slice(0..20) + "..." @@ -105,7 +106,7 @@ class Propane raise Error.new("Start rule not found") end @rule_sets.each do |rule_name, rule_set| - rule_set.patterns.each do |rule| + rule_set.rules.each do |rule| rule.components.map! do |component| if @tokens[component] @tokens[component] diff --git a/lib/propane/parser.rb b/lib/propane/parser.rb index 1a93d24..4036b91 100644 --- a/lib/propane/parser.rb +++ b/lib/propane/parser.rb @@ -2,13 +2,13 @@ class Propane class Parser - def initialize(tokens, rules) + def initialize(tokens, rule_sets) @token_eof = Token.new("$", nil, TOKEN_EOF) @item_sets = [] @item_sets_set = {} - start_items = rules["Start"].patterns.map do |pattern| - pattern.components << @token_eof - Item.new(pattern, 0) + start_items = rule_sets["Start"].rules.map do |rule| + rule.components << @token_eof + Item.new(rule, 0) end eval_item_sets = Set.new eval_item_sets << ItemSet.new(start_items) diff --git a/lib/propane/parser/item.rb b/lib/propane/parser/item.rb index c89d7bb..8f46cbb 100644 --- a/lib/propane/parser/item.rb +++ b/lib/propane/parser/item.rb @@ -3,24 +3,24 @@ class Propane class Item - attr_reader :pattern + attr_reader :rule attr_reader :position - def initialize(pattern, position) - @pattern = pattern + def initialize(rule, position) + @rule = rule @position = position end def next_component - @pattern.components[@position] + @rule.components[@position] end def hash - [@pattern, @position].hash + [@rule, @position].hash end def ==(other) - @pattern == other.pattern && @position == other.position + @rule == other.rule && @position == other.position end def eql?(other) @@ -28,9 +28,9 @@ class Propane end def closed_items - if @pattern.components[@position].is_a?(RuleSet) - @pattern.components[@position].patterns.map do |pattern| - Item.new(pattern, 0) + if @rule.components[@position].is_a?(RuleSet) + @rule.components[@position].rules.map do |rule| + Item.new(rule, 0) end else [] @@ -38,7 +38,7 @@ class Propane end def follow_symbol - @pattern.components[@position] + @rule.components[@position] end def followed_by?(symbol) @@ -46,21 +46,21 @@ class Propane end def next_position - Item.new(@pattern, @position + 1) + Item.new(@rule, @position + 1) end def to_s parts = [] - @pattern.components.each_with_index do |symbol, index| + @rule.components.each_with_index do |symbol, index| if @position == index parts << "." end parts << symbol.name end - if @position == @pattern.components.size + if @position == @rule.components.size parts << "." end - "#{@pattern.rule_set.name} -> #{parts.join(" ")}" + "#{@rule.name} -> #{parts.join(" ")}" end end diff --git a/lib/propane/rule.rb b/lib/propane/rule.rb new file mode 100644 index 0000000..5fa55dc --- /dev/null +++ b/lib/propane/rule.rb @@ -0,0 +1,19 @@ +class Propane + + class Rule + + attr_reader :name + + attr_reader :components + + attr_reader :code + + def initialize(name, components, code) + @name = name + @components = components + @code = code + end + + end + +end diff --git a/lib/propane/rule_set.rb b/lib/propane/rule_set.rb index ecaa249..9302f2e 100644 --- a/lib/propane/rule_set.rb +++ b/lib/propane/rule_set.rb @@ -2,36 +2,20 @@ class Propane class RuleSet - class Pattern - - attr_reader :rule_set - - attr_reader :components - - attr_reader :code - - def initialize(rule_set, components, code) - @rule_set = rule_set - @components = components - @code = code - end - - end - attr_reader :id attr_reader :name - attr_reader :patterns + attr_reader :rules def initialize(name, id) @name = name @id = id - @patterns = [] + @rules = [] end - def add_pattern(components, code) - @patterns << Pattern.new(self, components, code) + def add_rule(components, code) + @rules << Rule.new(@name, components, code) end end