def parse(self, text): tokens = self._lex(text) assert self._match("message", tokens) n = tokens.pop(0) element = SchemaElement(name=n) self.schema_elements = [element] if self._la1("{", tokens): g = self._parse_grp(tokens) element.num_children = len(g) return self.schema_elements
def _parse_grp(self, tokens): g = [] self._match("{", tokens) while not self._la1("}", tokens) and len(tokens) > 1: rt = FieldRepetitionType._NAMES_TO_VALUES[tokens.pop(0).upper()] t = tokens.pop(0) n = tokens.pop(0) element = SchemaElement(name=n, repetition_type=rt) self.schema_elements.append(element) g.append(element) if t != "group": assert self._match(";", tokens), "expect ';'" element.type = self._map_type(t) else: subg = self._parse_grp(tokens) element.num_children = len(subg) self._match("}", tokens) return g