parameters: (self, tokenizer, containerList)
docstring: Parser for PDBx data files and dictionaries.
  
              Input - tokenizer() reentrant method recognizing data item names (_category.attribute)
                      quoted strings (single, double and multi-line semi-colon delimited), and unquoted
                      strings.
  
                      containerList -  list-type container for data and definition objects parsed from
                                       from the input file.
  
              Return:
                      containerList - is appended with data and definition objects -
docstring_summary: Parser for PDBx data files and dictionaries.
docstring_tokens: Parser for PDBx data files and dictionaries .
function: def __parser(self, tokenizer, containerList):
          """ Parser for PDBx data files and dictionaries.
  
              Input - tokenizer() reentrant method recognizing data item names (_category.attribute)
                      quoted strings (single, double and multi-line semi-colon delimited), and unquoted
                      strings.
  
                      containerList -  list-type container for data and definition objects parsed from
                                       from the input file.
  
              Return:
                      containerList - is appended with data and definition objects - 
          """
          # Working container - data or definition
          curContainer = None
          #
          # Working category container 
          categoryIndex = {}
          curCategory = None
          #
          curRow = None
          state =  None
  
          # Find the first reserved word and begin capturing data.
          #
          while True:
              curCatName, curAttName, curQuotedString, curWord = next(tokenizer)
              if curWord is None:
                  continue
              reservedWord, state  = self.__getState(curWord)
              if reservedWord is not None:
                  break
          
          while True:
              #
              #  Set the current state  -
              #
              #  At this point in the processing cycle we are expecting a token containing
              #  either a '_category.attribute'  or a reserved word.  
              #
              if curCatName is not None:
                  state = "ST_KEY_VALUE_PAIR"
              elif curWord is not None:
                  reservedWord, state = self.__getState(curWord)
              else:
                  self.__syntaxError("Miscellaneous syntax error")
                  return            
  
              #
              # Process  _category.attribute  value assignments 
              #
              if state == "ST_KEY_VALUE_PAIR":
                  try:
                      curCategory = categoryIndex[curCatName]
                  except KeyError:
                      # A new category is encountered - create a container and add a row 
                      curCategory = categoryIndex[curCatName] = DataCategory(curCatName)
  
                      try:
                          curContainer.append(curCategory)
                      except AttributeError:
                          self.__syntaxError("Category cannot be added to  data_ block")
                          return
  
                      curRow = []                    
                      curCategory.append(curRow)
                  else:
                      # Recover the existing row from the category
                      try:
                          curRow = curCategory[0] 
                      except IndexError:
                          self.__syntaxError("Internal index error accessing category data")
                          return
  
                  # Check for duplicate attributes and add attribute to table.
                  if curAttName in curCategory.getAttributeList():
                      self.__syntaxError("Duplicate attribute encountered in category")
                      return
                  else:
                      curCategory.appendAttribute(curAttName)
  
  
                  # Get the data for this attribute from the next token
                  tCat, tAtt, curQuotedString, curWord = next(tokenizer)
  
                  if tCat is not None or (curQuotedString is None and curWord is None):
                      self.__syntaxError("Missing data for item _%s.%s" % (curCatName,curAttName))
  
                  if curWord is not None:
                      # 
                      # Validation check token for misplaced reserved words  -  
                      #
                      reservedWord, state  = self.__getState(curWord)
                      if reservedWord is not None:
                          self.__syntaxError("Unexpected reserved word: %s" % (reservedWord))
  
                      curRow.append(curWord)
  
                  elif curQuotedString is not None:
                      curRow.append(curQuotedString)
  
                  else:
                      self.__syntaxError("Missing value in item-value pair")
  
                  curCatName, curAttName, curQuotedString, curWord = next(tokenizer)
                  continue
  
              #
              # Process a loop_ declaration and associated data -
              #
              elif state == "ST_TABLE":
  
                  # The category name in the next curCatName,curAttName pair
                  #    defines the name of the category container.
                  curCatName,curAttName,curQuotedString,curWord = next(tokenizer)
  
                  if curCatName is None or curAttName is None:
                      self.__syntaxError("Unexpected token in loop_ declaration")
                      return
  
                  # Check for a previous category declaration.
                  if curCatName in categoryIndex:
                      self.__syntaxError("Duplicate category declaration in loop_")
                      return
  
                  curCategory = DataCategory(curCatName)
  
                  try:
                      curContainer.append(curCategory)
                  except AttributeError:
                      self.__syntaxError("loop_ declaration outside of data_ block or save_ frame")
                      return
  
                  curCategory.appendAttribute(curAttName)
  
                  # Read the rest of the loop_ declaration 
                  while True:
                      curCatName, curAttName, curQuotedString, curWord = next(tokenizer)
                      
                      if curCatName is None:
                          break
  
                      if curCatName != curCategory.getName():
                          self.__syntaxError("Changed category name in loop_ declaration")
                          return
  
                      curCategory.appendAttribute(curAttName)
  
  
                  # If the next token is a 'word', check it for any reserved words - 
                  if curWord is not None:
                      reservedWord, state  = self.__getState(curWord)
                      if reservedWord is not None:
                          if reservedWord == "stop":
                              return
                          else:
                              self.__syntaxError("Unexpected reserved word after loop declaration: %s" % (reservedWord))
                      
                  # Read the table of data for this loop_ - 
                  while True:
                      curRow = []                    
                      curCategory.append(curRow)
  
                      for tAtt in curCategory.getAttributeList():
                          if curWord is not None:
                              curRow.append(curWord)
                          elif curQuotedString is not None:
                              curRow.append(curQuotedString)
  
                          curCatName,curAttName,curQuotedString,curWord = next(tokenizer)
  
                      # loop_ data processing ends if - 
  
                      # A new _category.attribute is encountered
                      if curCatName is not None:
                          break
  
                      # A reserved word is encountered
                      if curWord is not None:
                          reservedWord, state = self.__getState(curWord)
                          if reservedWord is not None:
                              break
                          
                  continue
  
  
              elif state == "ST_DEFINITION":
                  # Ignore trailing unnamed saveframe delimiters e.g. 'save_'
                  sName=self.__getContainerName(curWord)
                  if (len(sName) > 0):
                      curContainer = DefinitionContainer(sName)
                      containerList.append(curContainer)
                      categoryIndex = {}
                      curCategory = None
  
                  curCatName,curAttName,curQuotedString,curWord = next(tokenizer)
  
              elif state == "ST_DATA_CONTAINER":
                  #
                  dName=self.__getContainerName(curWord)
                  if len(dName) == 0:
                      dName="unidentified"
                  curContainer = DataContainer(dName)
                  containerList.append(curContainer)
                  categoryIndex = {}
                  curCategory = None
                  curCatName,curAttName,curQuotedString,curWord = next(tokenizer)
  
              elif state == "ST_STOP":
                  return
              elif state == "ST_GLOBAL":
                  curContainer = DataContainer("blank-global")
                  curContainer.setGlobal()
                  containerList.append(curContainer)
                  categoryIndex = {}
                  curCategory = None
                  curCatName,curAttName,curQuotedString,curWord = next(tokenizer)
  
              elif state == "ST_UNKNOWN":
                  self.__syntaxError("Unrecogized syntax element: " + str(curWord))
                  return
function_tokens: def __parser ( self , tokenizer , containerList ) : # Working container - data or definition curContainer = None # # Working category container  categoryIndex = { } curCategory = None # curRow = None state = None # Find the first reserved word and begin capturing data. # while True : curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) if curWord is None : continue reservedWord , state = self . __getState ( curWord ) if reservedWord is not None : break while True : # #  Set the current state  - # #  At this point in the processing cycle we are expecting a token containing #  either a '_category.attribute'  or a reserved word.   # if curCatName is not None : state = "ST_KEY_VALUE_PAIR" elif curWord is not None : reservedWord , state = self . __getState ( curWord ) else : self . __syntaxError ( "Miscellaneous syntax error" ) return # # Process  _category.attribute  value assignments  # if state == "ST_KEY_VALUE_PAIR" : try : curCategory = categoryIndex [ curCatName ] except KeyError : # A new category is encountered - create a container and add a row  curCategory = categoryIndex [ curCatName ] = DataCategory ( curCatName ) try : curContainer . append ( curCategory ) except AttributeError : self . __syntaxError ( "Category cannot be added to  data_ block" ) return curRow = [ ] curCategory . append ( curRow ) else : # Recover the existing row from the category try : curRow = curCategory [ 0 ] except IndexError : self . __syntaxError ( "Internal index error accessing category data" ) return # Check for duplicate attributes and add attribute to table. if curAttName in curCategory . getAttributeList ( ) : self . __syntaxError ( "Duplicate attribute encountered in category" ) return else : curCategory . appendAttribute ( curAttName ) # Get the data for this attribute from the next token tCat , tAtt , curQuotedString , curWord = next ( tokenizer ) if tCat is not None or ( curQuotedString is None and curWord is None ) : self . __syntaxError ( "Missing data for item _%s.%s" % ( curCatName , curAttName ) ) if curWord is not None : #  # Validation check token for misplaced reserved words  -   # reservedWord , state = self . __getState ( curWord ) if reservedWord is not None : self . __syntaxError ( "Unexpected reserved word: %s" % ( reservedWord ) ) curRow . append ( curWord ) elif curQuotedString is not None : curRow . append ( curQuotedString ) else : self . __syntaxError ( "Missing value in item-value pair" ) curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) continue # # Process a loop_ declaration and associated data - # elif state == "ST_TABLE" : # The category name in the next curCatName,curAttName pair #    defines the name of the category container. curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) if curCatName is None or curAttName is None : self . __syntaxError ( "Unexpected token in loop_ declaration" ) return # Check for a previous category declaration. if curCatName in categoryIndex : self . __syntaxError ( "Duplicate category declaration in loop_" ) return curCategory = DataCategory ( curCatName ) try : curContainer . append ( curCategory ) except AttributeError : self . __syntaxError ( "loop_ declaration outside of data_ block or save_ frame" ) return curCategory . appendAttribute ( curAttName ) # Read the rest of the loop_ declaration  while True : curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) if curCatName is None : break if curCatName != curCategory . getName ( ) : self . __syntaxError ( "Changed category name in loop_ declaration" ) return curCategory . appendAttribute ( curAttName ) # If the next token is a 'word', check it for any reserved words -  if curWord is not None : reservedWord , state = self . __getState ( curWord ) if reservedWord is not None : if reservedWord == "stop" : return else : self . __syntaxError ( "Unexpected reserved word after loop declaration: %s" % ( reservedWord ) ) # Read the table of data for this loop_ -  while True : curRow = [ ] curCategory . append ( curRow ) for tAtt in curCategory . getAttributeList ( ) : if curWord is not None : curRow . append ( curWord ) elif curQuotedString is not None : curRow . append ( curQuotedString ) curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) # loop_ data processing ends if -  # A new _category.attribute is encountered if curCatName is not None : break # A reserved word is encountered if curWord is not None : reservedWord , state = self . __getState ( curWord ) if reservedWord is not None : break continue elif state == "ST_DEFINITION" : # Ignore trailing unnamed saveframe delimiters e.g. 'save_' sName = self . __getContainerName ( curWord ) if ( len ( sName ) > 0 ) : curContainer = DefinitionContainer ( sName ) containerList . append ( curContainer ) categoryIndex = { } curCategory = None curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) elif state == "ST_DATA_CONTAINER" : # dName = self . __getContainerName ( curWord ) if len ( dName ) == 0 : dName = "unidentified" curContainer = DataContainer ( dName ) containerList . append ( curContainer ) categoryIndex = { } curCategory = None curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) elif state == "ST_STOP" : return elif state == "ST_GLOBAL" : curContainer = DataContainer ( "blank-global" ) curContainer . setGlobal ( ) containerList . append ( curContainer ) categoryIndex = { } curCategory = None curCatName , curAttName , curQuotedString , curWord = next ( tokenizer ) elif state == "ST_UNKNOWN" : self . __syntaxError ( "Unrecogized syntax element: " + str ( curWord ) ) return