Make Regex::Parser build a NFA after parsing

This commit is contained in:
Josh Holtrop 2021-05-18 16:07:39 -04:00
parent d3df67be1e
commit 89a5976064

View File

@ -107,13 +107,14 @@ module Imbecile
nfa.start_state.add_transition(nil, nfa.end_state) nfa.start_state.add_transition(nil, nfa.end_state)
else else
ranges = @units.map(&:range) ranges = @units.map(&:range)
if unit.negate if @negate
ranges = negate_ranges(ranges) ranges = negate_ranges(ranges)
end end
ranges.each do |range| ranges.each do |range|
nfa.start_state.add_transition(range, nfa.end_state) nfa.start_state.add_transition(range, nfa.end_state)
end end
end end
nfa
end end
private private
def negate_ranges(ranges) def negate_ranges(ranges)
@ -171,10 +172,12 @@ module Imbecile
end end
attr_reader :unit attr_reader :unit
attr_reader :nfa
def initialize(pattern) def initialize(pattern)
@pattern = pattern.dup @pattern = pattern.dup
@unit = parse_alternates @unit = parse_alternates
@nfa = @unit.to_nfa
if @pattern != "" if @pattern != ""
raise Error.new(%[Unexpected "#{@pattern}" in pattern]) raise Error.new(%[Unexpected "#{@pattern}" in pattern])
end end