class Cucumber::CucumberExpressions::TreeRegexp

def create_group_builder(regexp)

def create_group_builder(regexp)
 = regexp.source
= [GroupBuilder.new]
start_stack = []
ng = false
lass = false
.each_char.with_index do |c, i|
 == '[' && !escaping
ar_class = true
f c == ']' && !escaping
ar_class = false
f c == '(' && !escaping && !char_class
oup_start_stack.push(i)
oup_builder = GroupBuilder.new
n_capturing = is_non_capturing(source, i)
oup_builder.set_non_capturing! if non_capturing
ack.push(group_builder)
f c == ')' && !escaping && !char_class
 = stack.pop
oup_start = group_start_stack.pop
 gb.capturing?
gb.source = source[group_start + 1...i]
stack.last.add(gb)
se
gb.move_children_to(stack.last)
d
ping = c == '\\' && !escaping
pop

def initialize(regexp)

def initialize(regexp)
  @regexp = regexp.is_a?(Regexp) ? regexp : Regexp.new(regexp)
  @group_builder = create_group_builder(@regexp)
end

def is_non_capturing(source, i)

def is_non_capturing(source, i)
x is valid. Bounds check not required.
rce[i + 1] != '?'
)
rn false
rce[i + 2] != '<'
:X)
idmsuxU-idmsuxU)
idmsux-idmsux:X)
=X)
!X)
>X)
rn true
rce[i + 3] == '=' || source[i + 3] == '!'
<=X)
<!X)
rn true
ame>X)
CucumberExpressionError.new('Named capture groups are not supported. See https://github.com/cucumber/cucumber/issues/329')

def match(s)

def match(s)
  match = @regexp.match(s)
  return nil if match.nil?
  group_indices = (0..match.length).to_a.to_enum
  @group_builder.build(match, group_indices)
end