The top level parser will do a loop where it looks for a single
        contact parse and then eats all whitespace until there is no more
        input left or another contact is found to be parsed and stores them.

def parse_top_level(self):
        """The top level parser will do a loop where it looks for a single
        contact parse and then eats all whitespace until there is no more
        input left or another contact is found to be parsed and stores them.
        """
        contacts = []
        while not self.eos:
            contact = self.parse_contact()  # match a contact expression.
            if not contact:  # There was no contact so end file.
                break  # This would be a nice place to put other expressions.
            contacts.append(contact)
            # skip all whitespace between the end of the last contact and the
            # next non whitespace character, ie until something interesting.
            self.parse_whitespace()
        output = {}
        for key, value in contacts:
            output[key] = value
        return output