コード例 #1
0
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
コード例 #2
0
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)