コード例 #1
0
ファイル: terminal.py プロジェクト: hermetique/dao
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
コード例 #2
0
def skip(compiler, cont, n=il.Integer(1)): 
  # return element after skip
  text = compiler.new_var(il.ConstLocalVar('text'))
  pos = compiler.new_var(il.ConstLocalVar('pos'))
  return il.Begin((
    il.AssignFromList(text, pos, il.parse_state),
    il.append_failcont(compiler, il.SetParseState(il.Tuple(text, pos))),
    il.SetParseState(il.Tuple(text, il.add(pos, n))),
    cont(il.GetItem(text, il.add(pos, n)))))
コード例 #3
0
ファイル: terminal.py プロジェクト: hermetique/dao
def string_on_predicate1(compiler, cont, test):
  '''return current char and step if @test succeed, where 
   @test: a python function with one argument, which tests on one char and return True or False
          @test must be registered with register_function'''
  test = test.interlang()
  text = compiler.new_var(il.ConstLocalVar('text'))
  pos = compiler.new_var(il.ConstLocalVar('pos'))
  length = compiler.new_var(il.ConstLocalVar('length'))
  p = compiler.new_var(il.LocalVar('p'))
  if not isinstance(test, il.PyFunction):
    raise DaoCompileTypeError(test)
  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.Call(test, il.GetItem(text, pos)),
        il.begin(
          il.Assign(p, il.add(pos, il.Integer(1))),
          il.While(il.And(il.Lt(p, length), il.Call(test, il.GetItem(text, p))),
                 il.AddAssign(p, il.Integer(1))),
          il.SetParseState(il.Tuple(text, p)),
          il.append_failcont(compiler, 
                             il.SetParseState(il.Tuple(text, pos))),
          cont(il.GetItem(text, il.Slice2(pos, p)))),
        il.failcont(il.FALSE)))))
コード例 #4
0
def left(compiler, cont, length=NONE):
  text = compiler.new_var(il.ConstLocalVar('text'))
  pos = compiler.new_var(il.ConstLocalVar('pos'))
  return il.Begin((
    il.AssignFromList(text, pos, il.parse_state),
    cont(il.GetItem(text, il.If(il.IsNot(length, NONE),
                                il.Slice2(pos, il.add(pos,length)),
                                il.Slice2(pos, NONE))))))
コード例 #5
0
ファイル: terminal.py プロジェクト: hermetique/dao
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)
コード例 #6
0
ファイル: testoptimize.py プロジェクト: chaosim/dao
 def test_if_assign7(self):
   x = il.Var('x')
   y = il.Var('y')
   exp = il.begin(il.Assign(x, il.Integer(1)), 
                  il.if_(y, il.Assign(x, il.Integer(2)), 
                         il.Assign(x, il.Integer(3))),
                  il.Assign(y, il.add(x, il.Integer(3))),
                  il.Prin(y), 
                  )
   result = optimize(exp)
   expect = il.begin(il.Assign(x, il.Integer(1)), 
                  il.if_(y, il.Assign(x, il.Integer(2)), 
                         il.Assign(x, il.Integer(3))),
                  il.Assign(y, il.add(x, il.Integer(3))),
                  il.Prin(y), 
                  )
   eq_(result, expect)
   eq_(result.statements[0].removed(), True)
   eq_(result.statements[1].then.removed(), False)
コード例 #7
0
ファイル: testoptimize.py プロジェクト: hermetique/dao
 def test_if_assign7(self):
     x = il.Var('x')
     y = il.Var('y')
     exp = il.begin(
         il.Assign(x, il.Integer(1)),
         il.if_(y, il.Assign(x, il.Integer(2)), il.Assign(x,
                                                          il.Integer(3))),
         il.Assign(y, il.add(x, il.Integer(3))),
         il.Prin(y),
     )
     result = optimize(exp)
     expect = il.begin(
         il.Assign(x, il.Integer(1)),
         il.if_(y, il.Assign(x, il.Integer(2)), il.Assign(x,
                                                          il.Integer(3))),
         il.Assign(y, il.add(x, il.Integer(3))),
         il.Prin(y),
     )
     eq_(result, expect)
     eq_(result.statements[0].removed(), True)
     eq_(result.statements[1].then.removed(), False)
コード例 #8
0
ファイル: matcher.py プロジェクト: chaosim/dao
def greedy_seplist(compiler, cont, item, separator, template=None, result=None):
  if result is None:
    return begin(item, greedy_any1(begin(separator, item))
                 ).cps(compiler, cont)  
  else:
    result1  = compiler.new_var(il.ConstLocalVar('result'))
    result2  = compiler.new_var(Var('result'))
    result2_2  = result2.interlang()
    template1 = template.interlang()
    return begin(item, 
                 direct_interlang(il.Assign(result1, il.GetValue(template1))), 
                 greedy_any2(begin(separator, item), template, result2),
                 eval_unify(result, direct_interlang(il.add(il.MakeList(result1), result2_2)))
                 ).cps(compiler, cont)  
コード例 #9
0
def seplist(compiler, cont, item, separator, template=None, result=None):
    if result is None:
        return begin(item, any1(begin(separator, item))).cps(compiler, cont)
    else:
        result1 = compiler.new_var(il.ConstLocalVar('result'))
        result2 = compiler.new_var(Var('result'))
        result2_2 = result2.interlang()
        template1 = template.interlang()
        return begin(
            item, direct_interlang(il.Assign(result1, il.GetValue(template1))),
            any2(begin(separator, item), template, result2),
            eval_unify(
                result,
                direct_interlang(il.add(il.MakeList(result1),
                                        result2_2)))).cps(compiler, cont)
コード例 #10
0
ファイル: testcpsconvert.py プロジェクト: hermetique/dao
 def test_add(self):
     result = cps(add(1, 2))
     expect = il.Clamda(a0, il.Clamda(a1, done()(il.add((a0, a1))))(2))(1)
     eq_(result, expect)
コード例 #11
0
ファイル: testcpsconvert.py プロジェクト: chaosim/dao
 def test_add(self):
   result = cps(add(1, 2))
   expect = il.Clamda(a0, il.Clamda(a1, done()(il.add((a0, a1))))(2))(1)
   eq_(result, expect)
コード例 #12
0
ファイル: testgencode.py プロジェクト: chaosim/dao
 def test_simple(self):
   eq_(generate_code(1), '1')
   eq_(generate_code(il.Var('a')), 'a')
   eq_(generate_code('a'), "'a'")
   eq_(generate_code(il.Assign(v, il.Integer(1))), "v = 1")
   eq_(generate_code(il.add(v, il.Integer(1))), "(v)+(1)")
コード例 #13
0
ファイル: testgencode.py プロジェクト: hermetique/dao
 def test_simple(self):
     eq_(generate_code(1), '1')
     eq_(generate_code(il.Var('a')), 'a')
     eq_(generate_code('a'), "'a'")
     eq_(generate_code(il.Assign(v, il.Integer(1))), "v = 1")
     eq_(generate_code(il.add(v, il.Integer(1))), "(v)+(1)")