def char_on_predicate(test, name=''): def func(solver, cont, arg0): #assert isinstance(arg0, Var) and arg0.free(solver.env) text, pos = solver.parse_state c = text[pos] if not test(c): return for _ in unify(arg0, c, solver.env): solver.parse_state = text, pos+1 yield cont, True solver.parse_state = text, pos if name=='': name = test.__name return matcher(name)(func)
def string__on_predicate(test, name='', onceMore=True): def func(solver, cont, arg): #assert isinstance(arg, Var) and arg.free(solver.env) text, pos = solver.parse_state string = '' i = 0 while pos+i<len(text): char = text[pos+i] if not test(char): break string += char i += 1 if onceMore and string=='': return for _ in unify(arg, string, solver.env): solver.parse_state = text, pos+i yield cont, True solver.parse_state = text, pos if name=='': name = test.__name return matcher(name)(func)
def quote_string(quote, name): def func(solver, cont, arg0): #assert isinstance(arg0, Var) and arg0.free(solver.env) text, pos = solver.parse_state if pos>=len(text): return if text[pos]!=quote: return p = pos+1 while p<len(text): char = text[p] p += 1 if char=='\\': p += 1 elif char==quote: string = text[pos+1:p-1] break else: return for _ in unify(arg0, string, solver.env): solver.parse_state = text, p yield cont, True solver.parse_state = text, pos return matcher(name)(func)