Exemple #1
0
def Subtract(left, right):
    left_arg_type, left_type, left_value = link.unpack(left)
    right_arg_type, right_type, right_value = link.unpack(right)
    if left_type == "number" and right_type == "number":
        value = left_value - right_value
        num = append.data_segment("number", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} "
                                 f"операция вычитания Sub не определена")
Exemple #2
0
def Multiply(left, right):
    left_arg_type, left_type, left_value = link.unpack(left)
    right_arg_type, right_type, right_value = link.unpack(right)
    if left_type == "number" and right_type == "number":
        value = left_value * right_value
        num = append.data_segment("number", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} "
                                 f"операция умножения Mul не определена")
Exemple #3
0
def Equal(left, right):
    left_arg_type, left_type, left_value = link.unpack(left)
    right_arg_type, right_type, right_value = link.unpack(right)
    if left_type == "number" and right_type == "number":
        value = left_value == right_value
        num = append.data_segment("logic", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} "
                                 f"операция сравнения Eql не определена")
Exemple #4
0
def Xor(left, right):
    left_arg_type, left_type, left_value = link.unpack(left)
    right_arg_type, right_type, right_value = link.unpack(right)
    if left_type == "logic" and right_type == "logic":
        value = left_value + right_value == 1
        num = append.data_segment("logic", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} "
                                 f"операция логического ЛИБО XOR не определена")
Exemple #5
0
def Divide(left, right):
    left_arg_type, left_type, left_value = link.unpack(left)
    right_arg_type, right_type, right_value = link.unpack(right)
    if left_type == "number" and right_type == "number":
        if right_value == 0:
            raise UndefinedBehaviour("Результат деления на ноль не определён")
        value = int(left_value / right_value)
        num = append.data_segment("number", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} "
                                 f"операция деления Div не определена")
Exemple #6
0
def Modulo(left, right):
    left_arg_type, left_type, left_value = link.unpack(left)
    right_arg_type, right_type, right_value = link.unpack(right)
    if left_type == "number" and right_type == "number":
        if right_value == 0:
            raise UndefinedBehaviour("Результат остатка деления на ноль не "
                                     "определён")
        value = left_value % right_value
        num = append.data_segment("number", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(
            f"Для типов {left_type} и {right_type} операция остаток от деления "
            f"Mod не определена")
Exemple #7
0
def Negative(arg):
    arg_type, obj_type, value = link.unpack(arg)
    if obj_type == "number":
        value = -value
        num = append.data_segment("number", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типа {obj_type} не определена операция "
                                 f"инверсии Neg")
Exemple #8
0
def Increment(arg):
    arg_type, obj_type, value = link.unpack(arg)
    if obj_type == "number":
        value += 1
        num = append.data_segment("number", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типа {obj_type} не определена операция "
                                 f"инкремента Inc")
Exemple #9
0
def Not(arg):
    arg_type, obj_type, value = link.unpack(arg)
    if obj_type == "logic":
        value = not value
        num = append.data_segment("logic", value)
        append.memory_stack("link", num)
    else:
        raise UndefinedBehaviour(f"Для типа {obj_type} не определена операция "
                                 f"логического НЕ Not")
Exemple #10
0
def Jump_if(condition, arg):
    cond_arg_type, cond_type, cond_value = link.unpack(condition)
    arg_type, arg_value = arg
    if arg_type == "link":
        if cond_type == "logic":
            if not cond_value:
                change.attribute(seg_links["system"], "target_cell", arg_value)
                append.memory_stack("link", 0)
        else:
            raise UndefinedBehaviour(
                f"Поведение команды Jif с аргументами типов {arg_type} и "
                f"{cond_type} не определено")
    else:
        raise UndefinedArgument(f"Поведение команды Jif с аргументом типа"
                                f"{arg_type} не определено")
Exemple #11
0
def Sub_object(parent, index):
    par_type, par_value = parent
    ind_arg_type, ind_type, ind_value = link.unpack(index)
    if ind_type == "link":
        ind_type, ind_value = link.get_link(ind_value)
    if ind_type != "number":
        raise UndefinedBehaviour(f"Получение элемента командой Sob с индексом"
                                 f"типа {ind_type} не определено")
    if ind_value < 0:
        raise UndefinedBehaviour(f"Получение элемента командой Sob с "
                                 f"отрицательным индексом не определено")
    if ind_value == 0:
        raise UndefinedBehaviour(f"Получение элемента командой Sob с "
                                 f"нулевым индексом не определено")
    if par_type == "link":
        kind, link_value = read.entity(par_value)
        if kind == "link":
            kind = find.kind(link_value)
            par_value = link_value
        if kind == "string_segment":
            elem_type, elem_value = get.string_segment_element(
                par_value, ind_value)
        elif kind == "list_segment":
            elem_type, elem_value = get.list_segment_element(
                par_value, ind_value)
        else:
            raise UndefinedBehaviour(f"Получение элемента командой Sob для "
                                     f"типа {kind} не определено")
        if elem_type == "none":
            num = append.data_segment("none", 0)
            append.memory_stack("link", num)
        elif elem_type == "link":
            append.memory_stack("link", elem_value)
        else:
            raise LowerCommandError(f"Поиск элемента не может возращать объект"
                                    f"типа {elem_type}")
    else:
        raise UndefinedArgument(f"Поведение команды Sob с аргументом типа"
                                f"{par_type} не определено")