def parse(scanner, rules, scope = ParserScope.empty)
      a = []
      p = start_pos = scanner.pos
      while result = term_parser.parse(scanner, rules, scope) and
            (!upper_bound or a.size < upper_bound)
        p = scanner.pos
        a << result
        break unless sep_parser.parse(scanner, rules, scope)
      end
      if a.size >= lower_bound
        scanner.pos = p
        capturing? ? a : true
      else
        scanner.pos = start_pos
        false
      end
    end
def parse(scanner, rules, scope = ParserScope.empty)
      a = []
      p = start_pos = scanner.pos
      while result = term_parser.parse(scanner, rules, scope) and
            (!upper_bound or a.size < upper_bound)
        p = scanner.pos
        a << result
        break unless sep_parser.parse(scanner, rules, scope)
      end
      if a.size >= lower_bound
        scanner.pos = p
        capturing? ? a : true
      else
        scanner.pos = start_pos
        false
      end
    end
Parse terms matched by the term parser in a list with separators matched
 by the separator parser. Return the terms in an array, or +true+ if the
 term parser is not <tt>capturing?</tt>. Fails returning false unless at
 least <tt>#lower_bound</tt> terms are matched and stops matching at
 <tt>#upper_bound</tt>.

 @param (see Match#parse)

 @return [Array or Boolean] an array containing the term parser's parse
   results, or +true+ if the term parser is not <tt>capturing?</tt> or
   +false+ if the parse fails.