[ create a new paste ] login | about

Link: http://codepad.org/Jyl0ls5y    [ raw code | output | fork ]

k4st - Python, pasted on Nov 28:
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)


Output:
1
2
3
4
5
4
3
2
1
0


Create a new paste based on this one


Comments: