class_docstr: A DataShape parser object.
class_docstr_tok: ["A","DataShape","parser","object","."]
docstr: <item>_list : <item> <SEP> <item>_list
              | <item>
  
  Returns a list of <item>s, or None.
docstr_tok: ["<","item",">","_list",":","<","item",">","<","SEP",">","<","item",">","_list","|","<","item",">","Returns","a","list","of","<","item",">","s",",","or","None","."]
code: def parse_homogeneous_list(
      self, parse_item, sep_tok_id, errmsg, trailing_sep=False
  ):
      """
      <item>_list : <item> <SEP> <item>_list
                  | <item>
  
      Returns a list of <item>s, or None.
      """
      saved_pos = self.pos
      # Parse zero or more "<item> <SEP>" repetitions
      items = []
      item = True
      while item is not None:
          # Parse the <item>
          item = parse_item()
          if item is not None:
              items.append(item)
              if self.tok.id == sep_tok_id:
                  # If a <SEP> is next, there are more items
                  self.advance_tok()
              else:
                  # Otherwise we've reached the end
                  return items
          else:
              if len(items) > 0:
                  if trailing_sep:
                      return items
                  else:
                      # If we already saw "<item> <SEP>" at least once,
                      # we can point at the more specific position within
                      # the list of <item>s where the error occurred
                      self.raise_error(errmsg)
              else:
                  self.pos = saved_pos
                  return None
  
imports: from __future__ import absolute_import, division, print_function
  from .None import lexer, error
  from .None import coretypes
label_desc: Use image node_id 5 for calling the DataShapeParser obj's underlying member method code with example usage: obj.parse_homogeneous_list(parse_item, sep_tok_id, errmsg, trailing_sep) and returns: items, None, items