def create_new_assign(old_cond, new_cond, coord): global coord_aux coord_aux -= 1 # coord = old_cond.coord new_coord = Coord(coord.file, coord.line, coord.column) new_coord.line = coord_aux new_coord.column = coord_aux # print type(new_cond), type(new_cond) assign = Assignment('=', ID(new_cond), ID(old_cond), new_coord) return assign
def whiles_to_if(extern_while_body, conditii=None): """ modifies the main while loop all recv loops are translated to ifs :param extern_while_body: :return: modified main while """ global coord_aux coord_aux -= 1 i = 0 # print "aaaaaaaaaaa", extern_while_body.coord # print extern_while_body.coord, "merge" size = len(extern_while_body.block_items) # print "aici e ok" list = [] delete = [] while i < size: aux = extern_while_body element = aux.block_items[i] if isinstance(element, While) and to_modify(element): coord = element.stmt.coord new_if = modify_while(element) if isinstance(new_if, If): list = aux.block_items[i + 1:] # next code is part of iftrue extern_while_body.block_items[i + 1:] = [ ] # don't copy the next code aux.block_items.remove(aux.block_items[i]) new_if.iftrue = Compound(list, coord) new_coord = Coord(coord.file, coord.line, coord.column) new_coord.line = coord_aux new_coord.column = coord_aux coord_aux -= 1 new_break_coord = Coord(coord.file, coord.line, coord.column) new_break_coord.line = coord_aux new_break_coord.column = coord_aux coord_aux -= 1 id_coord = Coord(coord.file, coord.line, coord.column) id_coord.line = coord_aux id_coord.column = coord_aux coord_aux -= 1 assign_coord = Coord(coord.file, coord.line, coord.column) assign_coord.line = coord_aux assign_coord.column = coord_aux new_if.iffalse = Compound([ Assignment('=', ID("round"), ID("ERR_ROUND"), assign_coord) ], new_coord) # FuncCall(ID("wait_for_messages", id_coord), None, new_break_coord) aux.block_items.insert(i, new_if) if new_if.iftrue: whiles_to_if(new_if.iftrue, conditii) break else: delete.append(aux.block_items[i] ) # daca are timeout, sterg bucla cu totull conditii.append((new_if, coord)) # aux.block_items[i] = None # elif isinstance(element, While) and (not to_modify(element)): # whiles_to_if(element.stmt, conditii) if isinstance(element, If): # if there is any if statement which contains # a recv loop in iftrue or iffalse it will be modified if isinstance(element.iftrue, Compound): to_delete = [] for index, item in enumerate(element.iftrue.block_items): if not isinstance(item, While): list.append(item) if isinstance(item, If): if item.iftrue: whiles_to_if( item.iftrue, conditii ) # nu stiu inca de ce trb sa pun asta aici if item.iffalse: whiles_to_if(item.iffalse, conditii) elif to_modify(item): # print item.coord, 'aaaa' coord = item.stmt.coord new_if = modify_while(item) if isinstance( new_if, If ): # daca intoarce if,adica daca nu are timeout lista = element.iftrue.block_items[index + 1:] element.iftrue.block_items[index + 1:] = [] element.iftrue.block_items.remove( element.iftrue.block_items[index]) new_if.iftrue = Compound(lista, coord) new_coord = Coord(coord.file, coord.line, coord.column) new_coord.line = coord_aux new_coord.column = coord_aux coord_aux -= 1 new_break_coord = Coord(coord.file, coord.line, coord.column) new_break_coord.line = coord_aux new_break_coord.column = coord_aux coord_aux -= 1 id_coord = Coord(coord.file, coord.line, coord.column) id_coord.line = coord_aux id_coord.column = coord_aux coord_aux -= 1 assign_coord = Coord(coord.file, coord.line, coord.column) assign_coord.line = coord_aux assign_coord.column = coord_aux new_if.iffalse = Compound([ Assignment('=', ID("round"), ID("ERR_ROUND"), assign_coord) ], new_coord) element.iftrue.block_items.insert(index, new_if) if new_if.iftrue: whiles_to_if(new_if.iftrue, conditii) break else: to_delete.append(element.iftrue.block_items[index]) conditii.append((new_if, coord)) # element.iftrue.block_items[index] = None for x in to_delete: element.iftrue.block_items.remove(x) if element.iffalse is not None: if isinstance(element.iffalse, Compound): to_delete = [] for index, item in enumerate(element.iffalse.block_items): # print item.coord if not isinstance(item, While): list.append(item) # print item if isinstance(item, If): whiles_to_if(item.iftrue, conditii) if item.iffalse: whiles_to_if(item.iffalse, conditii) elif to_modify(item): # print item.coord,"bbb" coord = item.stmt.coord new_if = modify_while(item) if isinstance(new_if, If): lista = element.iffalse.block_items[index + 1:] element.iffalse.block_items[index + 1:] = [] element.iffalse.block_items.remove( element.iffalse.block_items[index]) new_if.iffalse = Compound(lista, coord) # new_if.iffalse = Compound([Break()], coord_aux) element.iffalse.block_items.insert( index, new_if) if new_if.iffalse: whiles_to_if(new_if.iffalse, conditii) break else: to_delete.append( element.iffalse.block_items[index]) # element.iffalse.block_items[index] = None for x in to_delete: element.iffalse.block_items.remove(x) i += 1 for x in delete: extern_while_body.block_items.remove(x)