<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

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())