Recursively build item sets

This commit is contained in:
Josh Holtrop 2021-08-29 12:38:44 -04:00
parent ceb7e9ee32
commit 9dffa3c41a
2 changed files with 22 additions and 9 deletions

View File

@ -10,15 +10,26 @@ class Imbecile
pattern.components << token_eof pattern.components << token_eof
Item.new(pattern, 0) Item.new(pattern, 0)
end end
start_item_set = ItemSet.new(start_items) eval_item_sets = Set.new
eval_item_sets << ItemSet.new(start_items)
puts "Start item set:" while eval_item_sets.size > 0
puts start_item_set this_eval_item_sets = eval_item_sets
start_item_set.follow_symbols.each do |follow_symbol| eval_item_sets = Set.new
follow_set = start_item_set.follow_set(follow_symbol) 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 puts
puts "follow set:" item_set.follow_symbols.each do |follow_symbol|
puts follow_set follow_set = item_set.follow_set(follow_symbol)
eval_item_sets << follow_set
end
end
end
end end
end end

View File

@ -5,13 +5,15 @@ class Imbecile
attr_reader :items attr_reader :items
attr_accessor :id
def initialize(items) def initialize(items)
@items = Set.new(items) @items = Set.new(items)
close! close!
end end
def follow_symbols def follow_symbols
Set.new(@items.map(&:follow_symbol)) Set.new(@items.map(&:follow_symbol).compact)
end end
def follow_set(symbol) def follow_set(symbol)