M = { }
def term(t):
def match(l,s,ret):
if len(s) > l and s[l] == t:
ret(l+1)
return match
def seq(f0, f1):
return (lambda l,s,ret: f0(l, s, (lambda r: f1(r, s, ret))))
def alt(f0, f1):
def do_both(l,s,ret):
f0(l,s,ret)
f1(l,s,ret)
return do_both
def add_results_to_memo_table(var, l, r, s):
key = (var, l)
if r not in M[key][0]:
M[key][0] = M[key][0].union(set([r]))
for ret in M[key][1]:
ret(r)
def memo(var, l, s, ret, prods):
key = (var, l)
if key not in M:
M[key] = [set(), [ret]]
prods(l, s, (lambda r: add_results_to_memo_table(var, l, r, s)))
else:
M[key][1].append(ret)
for r in M[key][0]:
ret(r)
def epsilon(l, s, ret):
ret(l)
# S -> a S
# -> a A
# ->
def S(l, s, ret):
memo(S, l, s, ret, alt(seq(term("a"), S),
alt(seq(term("a"), A),
epsilon)))
# A -> a S
# -> a A
# ->
def A(l, s, ret):
memo(A, l, s, ret, alt(seq(term("a"), S),
alt(seq(term("a"), A),
epsilon)))
def print_result(r):
print r
t = 0
s = list("aaaa")
S(0, s, print_result)