def parse_regexp(regexp)
cache = @@_parse_regexp_cache ||= {}
if expression = cache[regexp]
return expression
end
unless regexp.is_a?(RegexpWithNamedGroups)
regexp = RegexpWithNamedGroups.new(regexp)
end
expression = Regin.parse(regexp)
unless Regin.regexp_supports_named_captures?
tag_captures = Proc.new do |group|
case group
when Regin::Group
group.instance_variable_set('@name', regexp.names[group.index]) if group.index
tag_captures.call(group.expression)
when Regin::Expression
group.each { |child| tag_captures.call(child) }
end
end
tag_captures.call(expression)
end
cache[regexp] = expression.freeze
expression
rescue Racc::ParseError, Regin::Parser::ScanError
[]
end