Пример #1
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)))
Пример #2
0
def or2_fun(compiler, cont, clause1, clause2):
  v = compiler.new_var(il.ConstLocalVar('v'))
  v1 = compiler.new_var(il.ConstLocalVar('v'))
  v2 = compiler.new_var(il.ConstLocalVar('v'))
  parse_state = compiler.new_var(il.ConstLocalVar('parse_state'))
  bindings = compiler.new_var(il.LocalVar('bindings'))
  fc = compiler.new_var(il.ConstLocalVar('old_failcont'))
  if has_cut_or(clause1) or has_cut_or(clause2):
    cut_or_cont = compiler.new_var(il.ConstLocalVar('cut_or_cont'))
    or_cont = il.clamda(v, il.SetCutOrCont(cut_or_cont), cont(v))
    return il.begin(
      il.Assign(cut_or_cont, il.cut_or_cont),
      il.Assign(parse_state, il.parse_state),
      il.Assign(bindings, il.Copy(il.bindings)),
      il.Assign(fc, il.failcont),
      il.SetCutOrCont(il.clamda(v2, 
        il.Assign(il.parse_state, parse_state),
        il.SetBindings(bindings),
        fc(il.FALSE))),
      il.SetFailCont(il.clamda(v1, 
        il.SetFailCont(fc),
        clause2.cps(compiler, or_cont))),
      clause1.cps(compiler, or_cont))
  else:
    return il.begin(
      il.Assign(fc, il.failcont),
      il.SetFailCont(il.clamda(v1, 
        il.SetFailCont(fc),
        clause2.cps(compiler, cont))),
      clause1.cps(compiler, cont))
Пример #3
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)
Пример #4
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)
Пример #5
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))
Пример #6
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))
Пример #7
0
def findall_1(compiler, cont, goal):
  v = compiler.new_var(il.ConstLocalVar('v'))
  v2 = compiler.new_var(il.ConstLocalVar('v'))
  fc = compiler.new_var(il.ConstLocalVar('old_failcont'))
  return il.begin(
    il.Assign(fc, il.failcont), 
    il.SetFailCont(il.clamda(v2, 
          il.SetFailCont(fc),
          cont(v2))),
    goal.cps(compiler, il.Clamda(v, il.failcont(v)))
    )
Пример #8
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))
Пример #9
0
def findall_2(compiler, cont, goal, template, bag):
  v = compiler.new_var(il.ConstLocalVar('v'))
  v2 = compiler.new_var(il.ConstLocalVar('v'))
  fc = compiler.new_var(il.ConstLocalVar('old_failcont'))
  bag = bag.interlang()
  template = template.interlang()
  return il.begin(
     il.Assign(bag, il.empty_list),
     il.Assign(fc, il.failcont), 
     il.SetFailCont(il.clamda(v2,
        il.SetFailCont(fc),
        cont(v2))),
      goal.cps(compiler, 
        il.clamda(v, 
          il.ListAppend(bag, il.GetValue(template)),
          il.failcont(v))))
Пример #10
0
def once(compiler, cont, exp):
  v = compiler.new_var(il.ConstLocalVar('v'))
  fc = compiler.new_var(il.ConstLocalVar('fc'))
  return il.begin(
    il.Assign(fc, il.failcont),
    exp.cps(compiler, 
                        il.clamda(v, il.SetFailCont(fc), cont(v))))
Пример #11
0
 def test_repeat(self):
     function = il.Var('function')
     result = cps(repeat)
     expect = il.begin(il.SetFailCont(function),
                       il.CFunction(function, v,
                                    done()(v)))
     eq_(result, expect)
Пример #12
0
def between(compiler, cont, lower, upper, mid):
  lower1 = compiler.new_var(il.ConstLocalVar('lower'))
  upper1 = compiler.new_var(il.ConstLocalVar('upper'))
  mid1 = compiler.new_var(il.ConstLocalVar('mid'))
  fc = compiler.new_var(il.ConstLocalVar('fc'))
  i = compiler.new_var(il.Var('i'))
  v = compiler.new_var(il.ConstLocalVar('v'))
  return lower.cps(compiler, il.clamda(lower1,
    upper.cps(compiler, il.clamda(upper1,
    mid.cps(compiler, il.clamda(mid1,
        il.If(il.IsLogicVar(mid1),
          il.begin(
            il.Assign(i, lower1),
            il.Assign(fc, il.failcont),
            il.SetFailCont(il.clamda(v, 
              il.If(il.Eq(i, upper1),
                il.Begin((
                  il.Assign(il.failcont, fc),
                  fc(il.FALSE))),
                il.Begin((
                  il.AddAssign(i, il.Integer(1)),
                  il.SetBinding(mid1, i),
                  cont(il.TRUE)))))),                
            il.SetBinding(mid1, lower1),
            cont(il.TRUE)),
          il.If(il.Cle(lower1, mid1, upper1),
            cont(il.TRUE),
            il.failcont(il.FALSE)))))
    ))))    
Пример #13
0
def first_(compiler, cont, clause1, clause2):
  v = compiler.new_var(il.ConstLocalVar('v'))
  fc = compiler.new_var(il.ConstLocalVar('fc'))
  first_cont = il.clamda(v, il.SetFailCont(fc), cont(v))
  return il.begin(
    il.Assign(fc, il.failcont),
    il.append_failcont(compiler, clause2.cps(compiler, first_cont)),
    clause1.cps(compiler, first_cont))
Пример #14
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))
Пример #15
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))
Пример #16
0
def wrap_cut(compiler, cont, exp):
  cut_cont = il.ConstLocalVar('cut_cont')
  v = il.ConstLocalVar('v')
  v1 = compiler.new_var(il.ConstLocalVar('v'))
  v2 = compiler.new_var(il.ConstLocalVar('v'))
  parse_state = compiler.new_var(il.ConstLocalVar('parse_state'))
  bindings = compiler.new_var(il.LocalVar('bindings'))
  fc = compiler.new_var(il.ConstLocalVar('old_failcont'))
  return il.begin(
    il.Assign(cut_cont, il.cut_cont),
    il.Assign(parse_state, il.parse_state),
    il.Assign(bindings, il.Copy(il.bindings)),
    il.Assign(fc, il.failcont),
    il.SetCutCont(il.clamda(v2, 
        il.Assign(il.parse_state, parse_state),
        il.SetBindings(bindings),
        fc(il.FALSE))),
    il.SetFailCont(il.clamda(v1,
      il.SetFailCont(fc),
      il.Assign(il.cut_cont, cut_cont),
      fc(il.FALSE))),
    exp.cps(compiler, il.clamda(v, 
      il.Assign(il.cut_cont, cut_cont),                         
      cont(v))))
Пример #17
0
def notunify(compiler, cont, x, y):
    v = compiler.new_var(il.ConstLocalVar('v'))
    cont1 = il.clamda(v, il.failcont(il.FALSE))
    cont2 = il.clamda(v, cont(il.TRUE))
    return il.begin(il.SetFailCont(cont2),
                    cps_convert_unify(x, y, compiler, cont1))
Пример #18
0
def not_p(compiler, cont, clause):
  fc = compiler.new_var(il.ConstLocalVar('old_fail_cont'))
  return il.begin(il.Assign(fc, il.failcont), 
                  il.SetFailCont(cont),
                  clause.cps(compiler, fc))
Пример #19
0
def cut_or(compiler, cont):
  return il.begin(il.SetFailCont(il.cut_or_cont), 
                  cont(NONE))