def parse(scanner, rules, scope = ParserScope.empty)
      a = []
      start_pos = scanner.pos
      while result = child.parse(scanner, rules, scope)
        a << result
        break if upper_bound? and a.size >= upper_bound
      end
      if a.size >= lower_bound
        capturing? ? select_captures(a) : true
      else
        scanner.pos = start_pos
        false
      end
    end
def parse(scanner, rules, scope = ParserScope.empty)
      a = []
      start_pos = scanner.pos
      while result = child.parse(scanner, rules, scope)
        a << result
        break if upper_bound? and a.size >= upper_bound
      end
      if a.size >= lower_bound
        capturing? ? select_captures(a) : true
      else
        scanner.pos = start_pos
        false
      end
    end
Parse using the wrapped parser repeatedly until it fails or the upper
 bound is reached. If the wrapped parser succeeds at least as many times
 as specified by the lower bound, return the results in an array, or
 +true+ if the wrapped parser is not <tt>capturing?</tt>.  Return +false+
 if the lower bound is not reached.

 @param (see Match#parse)

 @return [Array, Boolean] an array containing the decorated parser's parse
   results, or +true+ if the decorated parser is not <tt>capturing?</tt>,
   or +false+ if the decorated parser does not succeed up to the lower
   bound.