Add #to_nfa for other regex unit types
This commit is contained in:
parent
d8dd64d860
commit
ea27baa630
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user