Add #to_nfa for other regex unit types

This commit is contained in:
Josh Holtrop 2021-05-13 15:57:09 -04:00
parent d8dd64d860
commit ea27baa630

View File

@ -83,6 +83,11 @@ module Imbecile
def initialize(c) def initialize(c)
@code_point = c.ord @code_point = c.ord
end end
def to_nfa
nfa = NFA.new
nfa.start_state.add_transition(@code_point, nfa.end_state)
nfa
end
end end
class CharacterRangeUnit < Unit class CharacterRangeUnit < Unit
@ -92,6 +97,11 @@ module Imbecile
@min_code_point = c1.ord @min_code_point = c1.ord
@max_code_point = c2.ord @max_code_point = c2.ord
end end
def to_nfa
nfa = NFA.new
nfa.start_state.add_transition((@min_code_point..@max_code_point), nfa.end_state)
nfa
end
end end
class MultiplicityUnit < Unit class MultiplicityUnit < Unit
@ -103,6 +113,32 @@ module Imbecile
@min_count = min_count @min_count = min_count
@max_count = max_count @max_count = max_count
end end
def to_nfa
nfa = NFA.new
unit_nfa = @unit.to_nfa
nfa.start_state.add_transition(nil, unit_nfa.start_state)
if @min_count == 0
nfa.start_state.add_transition(nil, nfa.end_state)
else
(@min_count - 1).times do
prev_nfa = unit_nfa
unit_nfa = @unit.to_nfa
prev_nfa.end_state.add_transition(nil, unit_nfa.start_state)
end
end
unit_nfa.end_state.add_transition(nil, nfa.end_state)
if @max_count.nil?
unit_nfa.end_state.add_transition(nil, nfa.start_state)
else
(@max_count - @min_count).times do
prev_nfa = unit_nfa
unit_nfa = @unit.to_nfa
prev_nfa.end_state.add_transition(nil, unit_nfa.start_state)
unit_nfa.end_state.add_transition(nil, nfa.end_state)
end
end
nfa
end
end end
attr_reader :unit attr_reader :unit