From 9dffa3c41aa326a22b537a479bcafa6777ef855e Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 29 Aug 2021 12:38:44 -0400 Subject: [PATCH] Recursively build item sets --- lib/imbecile/parser.rb | 27 +++++++++++++++++++-------- lib/imbecile/parser/item_set.rb | 4 +++- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/imbecile/parser.rb b/lib/imbecile/parser.rb index 107c3f9..6e11a6d 100644 --- a/lib/imbecile/parser.rb +++ b/lib/imbecile/parser.rb @@ -10,15 +10,26 @@ class Imbecile pattern.components << token_eof Item.new(pattern, 0) end - start_item_set = ItemSet.new(start_items) + eval_item_sets = Set.new + eval_item_sets << ItemSet.new(start_items) - puts "Start item set:" - puts start_item_set - start_item_set.follow_symbols.each do |follow_symbol| - follow_set = start_item_set.follow_set(follow_symbol) - puts - puts "follow set:" - puts follow_set + while eval_item_sets.size > 0 + this_eval_item_sets = eval_item_sets + eval_item_sets = Set.new + this_eval_item_sets.each do |item_set| + unless item_sets_set.include?(item_set) + item_set.id = @item_sets.size + @item_sets << item_set + item_sets_set << item_set + puts "Item set #{item_set.id}:" + puts item_set + puts + item_set.follow_symbols.each do |follow_symbol| + follow_set = item_set.follow_set(follow_symbol) + eval_item_sets << follow_set + end + end + end end end diff --git a/lib/imbecile/parser/item_set.rb b/lib/imbecile/parser/item_set.rb index 8bc337d..0c7515a 100644 --- a/lib/imbecile/parser/item_set.rb +++ b/lib/imbecile/parser/item_set.rb @@ -5,13 +5,15 @@ class Imbecile attr_reader :items + attr_accessor :id + def initialize(items) @items = Set.new(items) close! end def follow_symbols - Set.new(@items.map(&:follow_symbol)) + Set.new(@items.map(&:follow_symbol).compact) end def follow_set(symbol)