def greedy_any1(compiler, cont, item): v = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) greedy_any_fcont = compiler.new_var(il.ConstLocalVar('greedy_any_fcont')) greedy_any_cont = compiler.new_var(il.ConstLocalVar('greedy_any_cont')) return il.begin( il.Assign(fc, il.failcont), il.cfunction(greedy_any_fcont, v, il.SetFailCont(fc), cont(il.TRUE)), il.cfunction(greedy_any_cont, v, il.SetFailCont(greedy_any_fcont), item.cps(compiler, greedy_any_cont))(il.TRUE))
def lazy_any1(compiler, cont, item): fc = compiler.new_var(il.ConstLocalVar('fc')) lazy_any_cont = compiler.new_var(il.ConstLocalVar('lazy_any_cont')) lazy_any_fcont = compiler.new_var(il.ConstLocalVar('lazy_any_fcont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assign(fc, il.failcont), il.cfunction(lazy_any_fcont, v, il.SetFailCont(fc), item.cps(compiler, lazy_any_cont)), il.cfunction(lazy_any_cont, v, il.SetFailCont(lazy_any_fcont), cont(il.TRUE))(il.TRUE))
def lazy_any1(compiler, cont, item): fc = compiler.new_var(il.ConstLocalVar('fc')) lazy_any_cont = compiler.new_var(il.ConstLocalVar('lazy_any_cont')) lazy_any_fcont = compiler.new_var(il.ConstLocalVar('lazy_any_fcont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assign(fc, il.failcont), il.cfunction(lazy_any_fcont, v, il.SetFailCont(fc), item.cps(compiler, lazy_any_cont)), il.cfunction(lazy_any_cont, v, il.SetFailCont(lazy_any_fcont), cont(il.TRUE)) (il.TRUE))
def repeat(compiler, cont): v = compiler.new_var(il.ConstLocalVar('v')) function = compiler.new_var(il.ConstLocalVar('function')) return il.begin(il.cfunction(function, v, cont(v)), il.PrintLn(il.String('repeat')), il.SetFailCont(function), function(NONE))
def any2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() any_cont = compiler.new_var(il.ConstLocalVar('any_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) v3 = compiler.new_var(il.ConstLocalVar('v')) return il.Begin( (il.Assign(result, il.empty_list), il.cfunction( any_cont, v, il.Assign(fc, il.failcont), il.SetFailCont( il.clamda( v, il.SetFailCont( il.clamda( v3, il.if2(result, il.DelListItem(result, il.Integer(-1))), fc(v3))), cont(v))), item.cps( compiler, il.clamda(v2, il.ListAppend(result, il.GetValue(template)), any_cont(v2))))(il.NONE)))
def any1(compiler, cont, item): any_cont = compiler.new_var(il.ConstLocalVar('any_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.cfunction( any_cont, v, il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v, il.SetFailCont(fc), cont(v))), item.cps(compiler, any_cont))(il.TRUE)
def some1(compiler, cont, item): some_cont = compiler.new_var(il.ConstLocalVar('some_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) some_cont = il.cfunction( some_cont, v, il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v, il.SetFailCont(fc), cont(v))), item.cps(compiler, some_cont)) return item.cps(compiler, some_cont)
def greedy_some2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() item_matched = compiler.new_var(il.Var('item_matched')) v = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) greedy_some_fcont = compiler.new_var(il.ConstLocalVar('greedy_some_fcont')) greedy_some_cont = compiler.new_var(il.ConstLocalVar('greedy_some_cont')) append_result_cont = il.clamda( v2, il.ListAppend(result, il.GetValue(template)), greedy_some_cont(il.TRUE)) return il.begin( il.Assign(result, il.empty_list), il.Assign(fc, il.failcont), il.cfunction(greedy_some_fcont, v, il.SetFailCont(fc), cont(il.TRUE)), il.cfunction(greedy_some_cont, v, il.SetFailCont(greedy_some_fcont), item.cps(compiler, append_result_cont)), item.cps(compiler, append_result_cont))
def any1(compiler, cont, item): any_cont = compiler.new_var(il.ConstLocalVar('any_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.cfunction(any_cont, v, il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v, il.SetFailCont(fc), cont(v))), item.cps(compiler, any_cont))(il.TRUE)
def cps(self, compiler, cont): # use cfunction, continue_block means recursive call. # tail recursive cfunction can be used to transform to while 1/break/continue. v = compiler.new_var(il.ConstLocalVar('v')) v1 = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) block_fun = compiler.new_var(il.ConstLocalVar('block_'+self.label.name)) compiler.exit_block_cont_map[self.label.name] = il.clamda(v1, cont(v1)) compiler.continue_block_cont_map[self.label.name] = il.clamda(v2, block_fun(v2)) return il.cfunction(block_fun, v, self.body.cps(compiler, cont))(il.NONE)
def lazy_any2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() fc = compiler.new_var(il.ConstLocalVar('fc')) lazy_any_cont = compiler.new_var(il.ConstLocalVar('lazy_any_cont')) lazy_any_fcont = compiler.new_var(il.ConstLocalVar('lazy_any_fcont')) v = compiler.new_var(il.ConstLocalVar('v')) v1 = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assign(result, il.empty_list), il.Assign(fc, il.failcont), il.cfunction( lazy_any_fcont, v, il.SetFailCont(fc), item.cps( compiler, il.clamda(v2, il.ListAppend(result, il.GetValue(template)), lazy_any_cont(il.TRUE)))), il.cfunction(lazy_any_cont, v, il.SetFailCont(lazy_any_fcont), cont(il.TRUE))(il.TRUE))
def lazy_some2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() fc = compiler.new_var(il.ConstLocalVar('fc')) lazy_some_cont = compiler.new_var(il.ConstLocalVar('lazy_some_cont')) lazy_some_fcont = compiler.new_var(il.ConstLocalVar('lazy_some_fcont')) v = compiler.new_var(il.ConstLocalVar('v')) v1 = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assign(result, il.empty_list), il.Assign(fc, il.failcont), il.cfunction(lazy_some_fcont, v, il.SetFailCont(fc), lazy_some_cont(il.TRUE)), il.cfunction(lazy_some_cont, v, item.cps(compiler, il.clamda(v2, il.SetFailCont(lazy_some_fcont), il.ListAppend(result, il.GetValue(template)), cont(il.TRUE))))(il.TRUE))
def some1(compiler, cont, item): some_cont = compiler.new_var(il.ConstLocalVar('some_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) some_cont = il.cfunction(some_cont, v, il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v, il.SetFailCont(fc), cont(v))), item.cps(compiler, some_cont)) return item.cps(compiler, some_cont)
def greedy_any2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() item_matched = compiler.new_var(il.Var('item_matched')) v = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) greedy_any_fcont = compiler.new_var(il.ConstLocalVar('greedy_any_fcont')) greedy_any_cont = compiler.new_var(il.ConstLocalVar('greedy_any_cont')) return il.begin( il.Assign(result, il.empty_list), il.Assign(fc, il.failcont), il.cfunction(greedy_any_fcont, v, il.SetFailCont(fc), cont(il.TRUE)), il.cfunction(greedy_any_cont, v, il.SetFailCont(greedy_any_fcont), item.cps(compiler, il.clamda(v2, il.ListAppend(result, il.GetValue(template)), greedy_any_cont(il.TRUE))))(il.TRUE))
def cps(self, compiler, cont): # use cfunction, continue_block means recursive call. # tail recursive cfunction can be used to transform to while 1/break/continue. v = compiler.new_var(il.ConstLocalVar('v')) v1 = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) block_fun = compiler.new_var( il.ConstLocalVar('block_' + self.label.name)) compiler.exit_block_cont_map[self.label.name] = il.clamda(v1, cont(v1)) compiler.continue_block_cont_map[self.label.name] = il.clamda( v2, block_fun(v2)) return il.cfunction(block_fun, v, self.body.cps(compiler, cont))(il.NONE)
def times1(compiler, cont, item, expect_times): expect_times = expect_times.interlang() i = compiler.new_var(il.Var('i')) times_cont = compiler.new_var(il.ConstLocalVar('times_cont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assert(il.And(il.Isinstance(expect_times, il.Int), il.Gt(expect_times, il.Integer(0)))), il.Assign(i, il.Integer(0)), il.cfunction(times_cont, v, item.cps(compiler, il.clamda(v, il.AddAssign(i, il.Integer(1)), il.If(il.Eq(i, expect_times), cont(v), times_cont(il.TRUE))))) (il.TRUE))
def times1(compiler, cont, item, expect_times): expect_times = expect_times.interlang() i = compiler.new_var(il.Var('i')) times_cont = compiler.new_var(il.ConstLocalVar('times_cont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assert( il.And(il.Isinstance(expect_times, il.Int), il.Gt(expect_times, il.Integer(0)))), il.Assign(i, il.Integer(0)), il.cfunction( times_cont, v, item.cps( compiler, il.clamda( v, il.AddAssign(i, il.Integer(1)), il.If(il.Eq(i, expect_times), cont(v), times_cont(il.TRUE)))))(il.TRUE))
def times2(compiler, cont, item, expect_times, template, result): expect_times = expect_times.interlang() template = template.interlang() result = result.interlang() i = compiler.new_var(il.Var('i')) times_cont = compiler.new_var(il.ConstLocalVar('times_cont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assert(il.And(il.Isinstance(expect_times, il.Int), il.Gt(expect_times, il.Integer(0)))), il.Assign(result, il.empty_list), il.Assign(i, il.Integer(0)), il.cfunction(times_cont, v, item.cps(compiler, il.clamda(v, il.AddAssign(i, il.Integer(1)), il.ListAppend(result, il.GetValue(template)), il.If(il.Eq(i, expect_times), cont(v), times_cont(il.TRUE))))) (il.TRUE))
def any2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() any_cont = compiler.new_var(il.ConstLocalVar('any_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) v3 = compiler.new_var(il.ConstLocalVar('v')) return il.Begin(( il.Assign(result, il.empty_list), il.cfunction(any_cont, v, il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v, il.SetFailCont(il.clamda(v3, il.if2(result, il.DelListItem(result, il.Integer(-1))), fc(v3))), cont(v))), item.cps(compiler, il.clamda(v2, il.ListAppend(result, il.GetValue(template)), any_cont(v2))))(il.NONE)))
def times2(compiler, cont, item, expect_times, template, result): expect_times = expect_times.interlang() template = template.interlang() result = result.interlang() i = compiler.new_var(il.Var('i')) times_cont = compiler.new_var(il.ConstLocalVar('times_cont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assert( il.And(il.Isinstance(expect_times, il.Int), il.Gt(expect_times, il.Integer(0)))), il.Assign(result, il.empty_list), il.Assign(i, il.Integer(0)), il.cfunction( times_cont, v, item.cps( compiler, il.clamda( v, il.AddAssign(i, il.Integer(1)), il.ListAppend(result, il.GetValue(template)), il.If(il.Eq(i, expect_times), cont(v), times_cont(il.TRUE)))))(il.TRUE))