docs: def parse(self, file_handle):
          '''
          Tokenize and parse the VCD file
  
          :ivar file_handle: opened file with vcd string
          '''
          # open the VCD file and create a token generator
          lineIterator = iter(enumerate(file_handle))
          tokeniser = ((lineNo, word) for lineNo, line in lineIterator
                       for word in line.split() if word)
  
          while True:
              token = next(tokeniser)
              # parse VCD until the end of definitions
              self.keyword_dispatch[token[1]](tokeniser, token[1])
              if self.end_of_definitions:
                  break
  
          while True:
              try:
                  lineNo, token = next(lineIterator)
              except StopIteration:
                  break
  
              # parse changes
              c = token[0]
              if c == '$':
                  # skip $dump* tokens and $end tokens in sim section
                  continue
              elif c == '#':
                  # [TODO] may be a float
                  self.now = int(token[1:])
              else:
                  sp = token.split()
                  sp_len = len(sp)
                  if sp_len == 1:
                      # 1 bit value
                      value = c
                      vcdId = token[1:]
                  elif sp_len == 2:
                      # vectors and strings
                      value, vcdId = sp
                  else:
                      raise VcdSyntaxError(
                          "Line %d: Don't understand: %s " % (lineNo, token))
  
                  self.value_change(vcdId.strip(), value.strip())