# File lib/rack/mount/utils.rb, line 128
    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
            # TODO: dup instead of mutating
            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