def do_parse(self, llparser): start_pos = llparser.position count = 0 results = [] if self.open_token is not None: next_token = llparser.peek_token() if next_token.token_type != self.open_token: return ParseError("Expecting open list token '{0}' got: {1}"\ .format(self.open_token, next_token.token_type), next_token.start_pos, next_token.end_pos) llparser.next_token() while True: # forget parsers result = self.forget_parse(llparser) if result is not None and result.iserror: return result result = self.parser.parse(llparser) if result.iserror: break # result is not an error results.append(result) count += 1 # forget parsers result = self.forget_parse(llparser) if result is not None and result.iserror: return result # separator if self.sep_token is not None: next_token = llparser.peek_token() if next_token.token_type != self.sep_token: break llparser.next_token() # end of loop if self.close_token is not None: next_token = llparser.peek_token() if next_token.token_type != self.close_token: return ParseError("Expecting close list token " "'{0}' got: {1}"\ .format(self.close_token, next_token.token_type), next_token.start_pos, next_token.end_pos) llparser.next_token() if count == 0 and self.minimum == 0: return ParseResult(None, start_pos, llparser.position) elif 0 < count < self.minimum: return ParseError('{0} element(s) is not enough ' '(minimum={1})'\ .format(count, self.minimum),\ start_pos,\ llparser.position) return ParseResult(results, start_pos, llparser.position)
def do_parse(self, llparser): start_pos = llparser.position result = self.parser.parse(llparser) if result.iserror: return ParseResult(None, start_pos, llparser.position) # ok, parsed return result
def do_parse(self, llparsing): start_pos = llparsing.position token = llparsing.peek_token() if token.token_type == self.__token_type: return ParseResult(llparsing.next_token(), start_pos, llparsing.position) else: return ParseError("Expecting '{0}' token"\ .format(self.__token_type), start_pos, llparsing.position)
def do_parse(self, llparser): start_pos = llparser.position count = 0 results = [] while True: # forget parsers result = self.forget_parse(llparser) if result is not None and result.iserror: return result result = self.parser.parse(llparser) if result.iserror: if count == 0 and self.minimum == 0: return ParseResult(None, start_pos, llparser.position) elif 0 < count < self.minimum: return ParseError('{0} repetition(s) is not enough ' '(minimum={1})'\ .format(count, self.minimum),\ start_pos,\ llparser.position) # TODO: stacking errors ? else: return ParseResult(results, start_pos, llparser.position) results.append(result)
def do_parse(self, llparser): start_pos = llparser.position results = [] for i in range(len(self.__parsers)): # forget parsers result = self.forget_parse(llparser) if result is not None and result.iserror: return result # skip parsers skips = None if i in self.__skips: skips = self.__skips[i] if skips: for skip in skips: result = skip.parse(llparser) if result.iserror: return result # element parser = self.__parsers[i] result = parser.parse(llparser) if result.iserror: return result results.append(result) # last skips skips = None if len(self.__parsers) in self.__skips: skips = self.__skips[len(self.__parsers)] if skips: for skip in skips: result = skip.parse(llparser) if result.iserror: return result end_pos = llparser.position if len(results) == 1: results = results[0] return ParseResult(results, start_pos, end_pos)
def parse(self, llparsing): if llparsing.debug_mode: llparsing.debug.enter(llparsing, self) result = self.forget_parse(llparsing) if result is not None and result.iserror: return result result = self.do_parse(llparsing) fresult = self.forget_parse(llparsing) if fresult is not None and fresult.iserror: return fresult if llparsing.debug_mode: llparsing.debug.leave(llparsing, self) if not result.iserror: if self.xform_result: result = self.xform_result(result) elif self.xform_content: result = ParseResult(self.xform_content(result), result.start_pos, result.end_pos) return result