Refactor into FA#enumerate

This commit is contained in:
Josh Holtrop 2021-06-22 22:01:39 -04:00
parent 5b688b090d
commit 5fecd5c6a2

View File

@ -18,18 +18,10 @@ module Imbecile
end end
end end
rv = "" rv = ""
states = {start_state => 0} states = enumerate
to_visit = [start_state] states.each do |state, id|
state_id = lambda do |state|
unless states.include?(state)
states[state] = states.values.max + 1
to_visit << state
end
states[state]
end
visit = lambda do |state|
accepts_s = state.accepts ? " #{state.accepts}" : "" accepts_s = state.accepts ? " #{state.accepts}" : ""
rv += "#{state_id[state]}#{accepts_s}:\n" rv += "#{id}#{accepts_s}:\n"
state.transitions.each do |transition| state.transitions.each do |transition|
if transition.nil? if transition.nil?
range_s = "nil" range_s = "nil"
@ -40,16 +32,28 @@ module Imbecile
end end
end end
accepts_s = transition.destination.accepts ? " #{transition.destination.accepts}" : "" accepts_s = transition.destination.accepts ? " #{transition.destination.accepts}" : ""
rv += " #{range_s} => #{state_id[transition.destination]}#{accepts_s}\n" rv += " #{range_s} => #{id}#{accepts_s}\n"
end end
end end
while to_visit.size > 0
visit[to_visit[0]]
to_visit.slice!(0)
end
rv rv
end end
def enumerate
id = 0
states = {}
visit = lambda do |state|
unless states.include?(state)
id += 1
states[state] = id
state.transitions.each do |transition|
visit[transition.destination]
end
end
end
visit[@start_state]
states
end
end end
end end