parameters: (tokens, options)
return_statement: return result
docstring: seq ::= ( atom [ '...' ] )* ;
docstring_summary: seq ::= ( atom [ '...' ] )* ;
docstring_tokens: seq :: = ( atom [ ... ] ) * ;
function: def parse_seq(tokens, options):
      """seq ::= ( atom [ '...' ] )* ;"""
      result = []
      while tokens.current() not in [None, ']', ')', '|']:
          atom = parse_atom(tokens, options)
          if tokens.current() == '...':
              atom = [OneOrMore(*atom)]
              tokens.move()
          result += atom
      return result
function_tokens: def parse_seq ( tokens , options ) : result = [ ] while tokens . current ( ) not in [ None , ']' , ')' , '|' ] : atom = parse_atom ( tokens , options ) if tokens . current ( ) == '...' : atom = [ OneOrMore ( * atom ) ] tokens . move ( ) result += atom return result