示例#1
0
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))
示例#2
0
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))
示例#3
0
文件: matcher.py 项目: chaosim/dao
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))
示例#4
0
文件: matcher.py 项目: chaosim/dao
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))
示例#5
0
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))
示例#6
0
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)))
示例#7
0
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)
示例#8
0
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)
示例#9
0
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))
示例#10
0
文件: matcher.py 项目: chaosim/dao
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)
示例#11
0
文件: special.py 项目: chaosim/dao
 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)
示例#12
0
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))
示例#13
0
文件: matcher.py 项目: chaosim/dao
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))
示例#14
0
文件: matcher.py 项目: chaosim/dao
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)
示例#15
0
文件: matcher.py 项目: chaosim/dao
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))
示例#16
0
文件: special.py 项目: hermetique/dao
 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)
示例#17
0
文件: matcher.py 项目: chaosim/dao
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))
示例#18
0
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))
示例#19
0
文件: matcher.py 项目: chaosim/dao
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))
示例#20
0
文件: matcher.py 项目: chaosim/dao
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)))
示例#21
0
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))