Ejemplo n.º 1
0
 def cps_convert_unify(x, y, compiler, cont):
   try: 
     y.cps_convert_unify
   except:
     x = x.interlang()
     y = y.interlang()      
     x1 = compiler.new_var(il.ConstLocalVar(x.name))
     return il.begin(
       il.Assign(x1, il.Deref(x)), #for LogicVar, could be optimized when generate code.
       il.If(il.IsLogicVar(x1),
          il.begin(il.SetBinding(x1, y),
                il.append_failcont(compiler, il.DelBinding(x1)),
                cont(il.TRUE)),
               il.If(il.Eq(x1, y), cont(il.TRUE), il.failcont(il.TRUE))))
   x = x.interlang()
   y = y.interlang()      
   x1 = compiler.new_var(il.ConstLocalVar(x.name))
   y1 = compiler.new_var(il.ConstLocalVar(y.name))
   return il.begin(
     il.Assign(x1, il.Deref(x)), #for LogicVar, could be optimized when generate code.
     il.Assign(y1, il.Deref(y)),
     il.If(il.IsLogicVar(x1),
        il.begin(il.SetBinding(x1, y1),
              il.append_failcont(compiler, il.DelBinding(x1)),
              cont(il.TRUE)),
        il.begin(
          il.If(il.IsLogicVar(y1),
             il.begin(il.SetBinding(y1, x1),
                   il.append_failcont(compiler, il.DelBinding(y1)),
                   cont(il.TRUE)),
             il.If(il.Eq(x1, y1), cont(il.TRUE), il.failcont(il.TRUE))))))
Ejemplo n.º 2
0
def eval_unify(compiler, cont, x, y):
    x1 = compiler.new_var(il.ConstLocalVar('x'))
    y1 = compiler.new_var(il.ConstLocalVar('y'))
    return x.cps(
        compiler,
        il.clamda(
            x1,
            y.cps(
                compiler,
                il.clamda(
                    y1,
                    il.If(
                        il.IsLogicVar(x1),
                        il.begin(
                            il.SetBinding(x1, y1),
                            il.append_failcont(compiler, il.DelBinding(x1)),
                            cont(il.TRUE)),
                        il.If(
                            il.IsLogicVar(y1),
                            il.begin(
                                il.SetBinding(y1, x1),
                                il.append_failcont(compiler,
                                                   il.DelBinding(y1)),
                                cont(il.TRUE)),
                            il.If(il.Eq(x1, y1), cont(il.TRUE),
                                  il.failcont(il.TRUE))))))))
Ejemplo n.º 3
0
def unify_macro_head_item2(compiler, cont, arg, head_item):
  if isinstance(head_item, Var):
    if not isinstance(head_item, LogicVar):
      return il.begin(
        il.Assign(head_item.interlang(), arg),
        cont(il.TRUE))
    else: 
      v = compiler.new_var(il.ConstLocalVar('v'))
      head_item = head_item.interlang()
      arg1 = compiler.new_var(il.ConstLocalVar('arg'))
      head1 = compiler.new_var(il.ConstLocalVar('head'))
      return il.begin(
        il.Assign(arg1, il.Deref(arg)), #for LogicVar, could be optimized when generate code.
        il.Assign(head1, il.Deref(head_item)),
        il.If(il.IsLogicVar(arg1),
           il.begin(il.SetBinding(arg1, head1),
                 il.append_failcont(compiler, il.DelBinding(arg1)),
                 cont(il.TRUE)),
           il.begin(
             il.If(il.IsLogicVar(head1),
                il.begin(il.SetBinding(head1, arg1),
                      il.append_failcont(compiler, il.DelBinding(head1)),
                      cont(il.TRUE)),
                il.If(il.Eq(arg1, head1), cont(il.TRUE), il.failcont(il.FALSE))))))
  else:    
    arg1 = compiler.new_var(il.ConstLocalVar('arg'))
    return il.begin(
      il.Assign(arg1, il.Deref(arg)),
      il.If(il.IsLogicVar(arg1),
         il.begin(il.SetBinding(arg1, head_item),
               il.append_failcont(compiler, il.DelBinding(arg1)),
               cont(il.TRUE)),
              il.If(il.Eq(arg1, head_item), cont(TRUE), il.failcont(TRUE))))
Ejemplo n.º 4
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)))))
    ))))    
Ejemplo n.º 5
0
def unify_head_item2(compiler, cont, arg, head_item):
  # for call with rules variable.
  arg = arg.interlang()
  if not isinstance(head_item, Var):
    # arg should be Var
    if isinstance(head_item, Cons):
      v = compiler.new_var(il.ConstLocalVar('v'))
      return do_unify_head_item2(il.ConsHead(arg), head_item.head, compiler, 
                            il.clamda(v, 
                            do_unify_head_item2(il.ConsTail(arg), head_item.tail, 
                                                compiler, cont)))
    else:
      head_item = head_item.interlang()
      arg1 = compiler.new_var(il.ConstLocalVar('arg'))
      return il.begin(
        il.Assign(arg1, il.Deref(arg)),
        il.If(il.IsLogicVar(arg1),
           il.begin(il.SetBinding(arg1, head_item),
                 il.append_failcont(compiler, il.DelBinding(arg1)),
                 cont(il.TRUE)),
                il.If(il.Eq(arg1, head_item), cont(TRUE), il.failcont(TRUE))))
  else:
    if not isinstance(head_item, LogicVar):
      return il.begin(
        il.Assign(head_item.interlang(), arg),
        cont(il.TRUE))
    else:
      raise CompileTypeError
Ejemplo n.º 6
0
def integer(compiler, cont, arg):
  '''integer'''
  text = compiler.new_var(il.ConstLocalVar('text'))
  pos = compiler.new_var(il.ConstLocalVar('pos'))
  p = compiler.new_var(il.LocalVar('p'))
  length = compiler.new_var(il.ConstLocalVar('length'))
  if isinstance(arg, Var):
    arg = arg.interlang()
    x = compiler.new_var(il.ConstLocalVar('x'))
    return il.Begin((
      il.AssignFromList(text, pos, il.parse_state),
      il.Assign(length, il.Len(text)),
      il.If(il.Ge(pos, length), 
        il.failcont(il.FALSE),
          il.If(il.Not(il.Cle(il.String('0'), il.GetItem(text, pos), il.String('9'))),
            il.failcont(il.FALSE),
            il.Begin((
              il.Assign(p, il.add(pos, il.Integer(1))),
              il.while_(il.And(il.Lt(p, length), 
                              il.Cle(il.String('0'),il.GetItem(text, p),il.String('9'))), 
                       il.AddAssign(p, il.Integer(1))),
              il.Assign(x, il.Deref(arg)),
              il.If(il.IsLogicVar(x),
                    il.begin(il.SetParseState(il.Tuple(text, p)),
                                   il.SetBinding(x, il.GetItem(text, il.Slice2(pos, p))),
                                   il.append_failcont(compiler, 
                                      il.SetParseState(il.Tuple(text, pos)),
                                      il.DelBinding(x)),
                                   cont(il.GetItem(text, pos))),
                    il.If(il.Isinstance(x, il.String('str')),
                          il.If(il.Eq(x, il.GetItem(text, il.Slice2(pos, p))),
                                il.begin(il.append_failcont(compiler, 
                                  il.SetParseState(il.Tuple(text, pos))),
                                  il.SetParseState(il.Tuple(text, p)),
                                  cont(il.GetItem(text, pos))),
                                il.failcont(il.NONE)),
                          il.RaiseTypeError(x)))))))))
  elif isinstance(arg, il.String):
    return il.Begin((
      il.AssignFromList(text, pos, il.parse_state),
      il.Assign(length, il.Len(text)),
      il.If(il.Ge(pos, length), 
        il.failcont(il.FALSE),
          il.If(il.Not(il.Cle(il.String('0'), il.GetItem(text, pos), il.String('9'))),
            il.failcont(il.FALSE),
            il.Begin((
              il.Assign(p, il.add(pos, il.Integer(1))),
              il.while_(il.And(il.Lt(p, length), 
                              il.Cle(il.String('0'),il.GetItem(text, p),il.String('9'))), 
                       il.AddAssign(p, il.Integer(1))),
              il.If(il.Eq(arg, il.GetItem(text, il.Slice2(pos, p))),
                    il.begin(il.append_failcont(compiler, 
                      il.SetParseState(il.Tuple(text, pos))),
                      il.SetParseState(il.Tuple(text, p)),
                      cont(arg)),
                    il.failcont(il.NONE))))))))
  else:
    raise CompileTypeError
Ejemplo n.º 7
0
 def test_unify2(self):
     x = LogicVar('x')
     result = compile_optimize(unify(x, 2))
     x1 = il.LogicVar('x')
     x2 = il.ConstLocalVar('x')
     expect = il.begin(
         il.Assign(x2, il.Deref(LogicVar(x1))),
         il.If(
             il.IsLogicVar(x2),
             il.begin(il.SetBinding(x2, il.Integer(2)), il.TRUE),
             il.If(il.Eq(x2, il.Integer(2)), il.TRUE,
                   il.failcont(il.TRUE))))
     eq_(result, expect)
Ejemplo n.º 8
0
def char(compiler, cont, argument):
  text = compiler.new_var(il.ConstLocalVar('text'))
  pos = compiler.new_var(il.ConstLocalVar('pos'))
  if isinstance(argument, String):
    argument = argument.interlang()
    return il.Begin((
      il.AssignFromList(text, pos, il.parse_state),
      il.If(il.Ge(pos, il.Len(text)), 
        il.failcont(il.NONE),
        il.If(il.Eq(argument, il.GetItem(text, pos)),
              il.begin(il.append_failcont(compiler, 
                              il.SetParseState(il.Tuple(text, pos))),
                       il.SetParseState(il.Tuple(text, il.add(pos, il.Integer(1)))),
                       cont(il.GetItem(text, pos))),
              il.failcont(il.NONE)))))
  
  elif isinstance(argument, Var):
    v = compiler.new_var(il.ConstLocalVar('v'))
    argument = argument.interlang()
    argument1 = compiler.new_var(il.ConstLocalVar('argument'))
    return il.Begin((
      il.AssignFromList(text, pos, il.parse_state),
      il.If(il.Ge(pos,il.Len(text)), 
        il.failcont(il.FALSE),
        il.Begin((
          il.Assign(argument1, il.Deref(argument)),
          #il.Prin(text), il.Prin(pos), il.PrintLn(argument1),
          il.If(il.Isinstance(argument1, il.Symbol('str')),
            il.If(il.Eq(argument1, il.GetItem(text, pos)),
                  il.begin(il.append_failcont(compiler, 
                                  il.SetParseState(il.Tuple(text, pos))),
                           il.SetParseState(il.Tuple(text, il.add(pos, il.Integer(1)))),
                           cont(il.GetItem(text, pos))),
                  il.failcont(il.NONE)),
            il.If(il.IsLogicVar(argument1),
                  il.begin(il.SetParseState(il.Tuple(text, il.add(pos, il.Integer(1)))),
                           il.SetBinding(argument1, il.GetItem(text, pos)),
                           il.append_failcont(compiler, 
                              il.SetParseState(il.Tuple(text, pos)),
                              il.DelBinding(argument1)),
                           cont(il.GetItem(text, pos))),
                  il.RaiseTypeError(argument1))))))))
      
  # elif isinstance(argument, il.LogicVar) #how about this? It should be include above.
  else: raise CompileTypeError(argument)
Ejemplo n.º 9
0
def unify_parse_sequence(compiler, cont, sequence):
  x = compiler.new_var(il.ConstLocalVar('x'))
  try:  
    sequence.cps_convert_unify
  except:
    sequence = sequence.interlang()
    return il.If(il.Eq(sequence, il.GetItem(il.parse_state, il.Integer(0))),
          cont(TRUE),
          il.failcont(il.TRUE))          
  return il.Begin((
      il.Assign(x, il.Deref(sequence.interlang())),
      il.If(il.IsLogicVar(x),
            il.begin(il.SetBinding(x, il.GetItem(il.parse_state, il.Integer(0))),
                     il.append_failcont(compiler, il.DelBinding(x)),
                      cont(il.TRUE)),
            il.If(il.Eq(x, il.GetItem(il.parse_state, il.Integer(0))),
                      cont(TRUE),
                      il.failcont(il.TRUE))))) 
Ejemplo n.º 10
0
def is_(compiler, cont, var, exp):
    var = il.LogicVar(var.name)
    v = compiler.new_var(il.ConstLocalVar('v'))
    return exp.cps(compiler, il.clamda(v, il.SetBinding(var, v), cont(v)))