parameters: (s, number_class)
return_statement: return number_list
docstring: Take a string representing a list of numbers and number ranges and return
      a list of the parsed numbers.  For example: '1, 2, 50 to 100 by 5'
      Acceptable strings follow the grammar:
  
        A =: <A> <B>
        B =: <number> | <C>
        C =: "<number> to <number>" <D>
        D =: "by <number>" | ""
docstring_summary: Take a string representing a list of numbers and number ranges and return
      a list of the parsed numbers.  For example: '1, 2, 50 to 100 by 5'
      Acceptable strings follow the grammar:
docstring_tokens: Take a string representing a list of numbers and number ranges and return a list of the parsed numbers . For example : 1 2 50 to 100 by 5 Acceptable strings follow the grammar :
function: def parse_number_list(s, number_class):
      """Take a string representing a list of numbers and number ranges and return
      a list of the parsed numbers.  For example: '1, 2, 50 to 100 by 5'
      Acceptable strings follow the grammar:
  
        A =: <A> <B>
        B =: <number> | <C>
        C =: "<number> to <number>" <D>
        D =: "by <number>" | ""
  
      """
      # remove commas, convert to lower case, split into tokens and parse
      tokens = s.replace(',', '').lower().split()
      number_list = []
      while len(tokens):
          if tokens_are_range(tokens, number_class): number_list += pop_range_tokens(tokens, number_class)
          else: number_list += [pop_number_token(number_class, tokens)]
      return number_list
function_tokens: def parse_number_list ( s , number_class ) : # remove commas, convert to lower case, split into tokens and parse tokens = s . replace ( ',' , '' ) . lower ( ) . split ( ) number_list = [ ] while len ( tokens ) : if tokens_are_range ( tokens , number_class ) : number_list += pop_range_tokens ( tokens , number_class ) else : number_list += [ pop_number_token ( number_class , tokens ) ] return number_list