Exemple #1
0
    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
Exemple #2
0
    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