def __call__(self, inp: str, parse_inp: ParseResult = None, idx: int = 0) -> ParseResult: # Handle the 'zeroth' time empty_result = self.E(inp, parse_inp=parse_inp, idx=idx) result = self.A(inp, parse_inp=empty_result) if len(result) == 0: return empty_result if len(result) == 1: return result # run this zero or more times up to unlimited bound start_idx = result.last_idx() while True: new_result = self.A(inp, idx=result.last_idx()) if new_result.last_idx() <= result.last_idx() or new_result.empty( ): break result = new_result parser_out = ParseResult() parser_out.extend(empty_result) # if we dont accept partial results and haven't consumed the # whole input then return an empty result #if not self.accept_partial and result.last_idx() < len(inp): # return parser_out parser_out.add(result.last_idx(), inp[start_idx - 1:result.last_idx()]) return parser_out
def __call__(self, inp: str, parse_inp: ParseResult = None, idx: int = 0) -> ParseResult: start_idx = parse_inp.last_idx() if parse_inp is not None else idx a_result = self.A(inp, parse_inp, idx=idx) if a_result.empty() or a_result.last_idx() == start_idx: return ParseResult() b_result = self.B(inp, a_result) if b_result.last_idx() <= a_result.last_idx(): return ParseResult() parse_out = ParseResult() parse_out.extend(a_result) parse_out.update(b_result.last_idx(), b_result.last_str()) return parse_out