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
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)))))
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)))))
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))))))
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)
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)
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)
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)
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)
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)
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)")