def maybe_special_unary(orig): return { 'p--': (lambda x: mc.Assignment(x, mc.BinaryOp('-', x, mc.Constant('int', '1')), nid=get_new_id())), 'p++': (lambda x: mc.Assignment(x, mc.BinaryOp('+', x, mc.Constant('int', '1')), nid=get_new_id())), '--': (lambda x: mc.Assignment(x, mc.BinaryOp('-', x, mc.Constant('int', '1')), nid=get_new_id())), '++': (lambda x: mc.Assignment(x, mc.BinaryOp('+', x, mc.Constant('int', '1')), nid=get_new_id())) }.get(orig.op, lambda x: mc.UnaryOp(orig.op, x, coord=orig.coord, nid=get_new_id()))(transform(orig.expr))
def maybe_special_unary(orig): return { 'p--': (lambda x: mc.Assignment( x, mc.BinaryOp('-', x, mc.Constant('int', '1')))), 'p++': (lambda x: mc.Assignment( x, mc.BinaryOp('+', x, mc.Constant('int', '1')))), '--': (lambda x: mc.Assignment( x, mc.BinaryOp('-', x, mc.Constant('int', '1')))), '++': (lambda x: mc.Assignment( x, mc.BinaryOp('+', x, mc.Constant('int', '1')))) }.get(orig.op, lambda x: mc.UnaryOp(orig.op, x))(t(orig.expr))
def t(x): return { c_ast.ArrayDecl: (lambda orig: mc.ArrayDecl(t(orig.type), orig.dim, coord=orig.coord)), c_ast.ArrayRef: (lambda orig: mc.ArrayRef(t(orig.name), t(orig.subscript))), c_ast.Assignment: (lambda orig: of_assignment(orig)), c_ast.BinaryOp: (lambda orig: mc.BinaryOp( v(orig.op), t(orig.left), t(orig.right), coord=orig.coord)), c_ast.Compound: (lambda orig: mc.Block(map(t, orig.block_items), coord=orig.coord)), c_ast.Constant: (lambda orig: mc.Constant( t(orig.type), v(orig.value), coord=orig.coord)), c_ast.Decl: (lambda orig: mc.Decl(t(orig.name), t(orig.funcspec), t(orig.type), t(orig.init), coord=orig.coord)), c_ast.DeclList: (lambda orig: mc.DeclList(tmap(orig.decls), coord=orig.coord)), c_ast.DoWhile: (lambda orig: mc.DoWhile(t(orig.cond), t(orig.stmt), coord=orig.coord) ), c_ast.EmptyStatement: (lambda orig: mc.EmptyStatement()), c_ast.ExprList: (lambda orig: mc.ExprList(tmap(orig.exprs))), c_ast.FileAST: (lambda orig: mc.FileAST(map(t, orig.ext))), c_ast.For: (lambda orig: mc.For(t(orig.init), t(orig.cond), t(orig.next), t(orig.stmt), coord=orig.coord)), c_ast.FuncCall: (lambda orig: mc.FuncCall(t(orig.name), tmap(orig.args))), c_ast.FuncDecl: (lambda orig: mc.FuncDecl(tmap(orig.args), t(orig.type))), c_ast.FuncDef: (lambda orig: mc.FuncDef(t( orig.decl), tmap(orig.param_decls), t(orig.body))), c_ast.ID: (lambda orig: mc.ID(v(orig.name))), c_ast.IdentifierType: (lambda orig: mc.IdentifierType(tmap(orig.names))), c_ast.If: (lambda orig: mc.If(t(orig.cond), t(orig.iftrue), t(orig.iffalse))), c_ast.InitList: (lambda orig: mc.InitList(tmap(orig.exprs))), c_ast.NamedInitializer: (lambda orig: mc.NamedInitializer(v(orig.name), t(orig.expr))), c_ast.ParamList: (lambda orig: mc.ParamList(tmap(orig.params))), c_ast.PtrDecl: (lambda orig: mc.PtrDecl(t(orig.type))), c_ast.Return: (lambda orig: mc.Return(t(orig.expr))), c_ast.TernaryOp: (lambda orig: mc.TernaryOp(t(orig.cond), t( orig.iftrue), t(orig.iffalse))), c_ast.Typename: (lambda orig: mc.Typename(v(orig.name), t(orig.type))), c_ast.TypeDecl: (lambda orig: mc.TypeDecl(v(orig.declname), t(orig.type))), c_ast.UnaryOp: (lambda orig: maybe_special_unary(orig)), c_ast.While: (lambda orig: mc.While(t(orig.cond), t(orig.stmt))), str: (lambda orig: orig), int: (lambda orig: orig), float: (lambda orig: orig), list: (lambda orig: tmap(orig)) }.get(x.__class__, lambda y: nomatch(y))(x)
def of_assignment(orig): lvalue = transform(orig.lvalue) if orig.rvalue is not None: rvalue = transform(orig.rvalue) else: rvalue = None final_rvalue = { '=': rvalue, '+=': mc.BinaryOp('+', lvalue, rvalue, nid=get_new_id()), '-=': mc.BinaryOp('-', lvalue, rvalue, nid=get_new_id()), '*=': mc.BinaryOp('*', lvalue, rvalue, nid=get_new_id()), '/=': mc.BinaryOp('/', lvalue, rvalue, nid=get_new_id()), '%=': mc.BinaryOp('%', lvalue, rvalue, nid=get_new_id()), '^=': mc.BinaryOp('^', lvalue, rvalue, nid=get_new_id()), '|=': mc.BinaryOp('|', lvalue, rvalue, nid=get_new_id()), '>>=': mc.BinaryOp('>>', lvalue, rvalue, nid=get_new_id()), '<<=': mc.BinaryOp('<<', lvalue, rvalue, nid=get_new_id()), '&=': mc.BinaryOp('&', lvalue, rvalue, nid=get_new_id()), '++': mc.BinaryOp('+', lvalue, mc.Constant('int', '1'), nid=get_new_id()), '--': mc.BinaryOp('-', lvalue, mc.Constant('int', '1'), nid=get_new_id()), }.get(orig.op, mc.EmptyStatement()) return mc.Assignment(lvalue, final_rvalue, coord=orig.coord, nid=get_new_id())