Пример #1
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")
Пример #2
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")
Пример #3
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")
Пример #4
0
def Push(arg):
    arg_type, arg_value = arg
    if arg_type == "none":
        append.memory_stack("link", 0)
    elif arg_type == "number":
        num = append.data_segment("number", arg_value)
        append.memory_stack("link", num)
    else:
        raise UndefinedArgument(f"Поведение команды Psh с аргументом типа "
                                f"{arg_type} не определено")
Пример #5
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 не определена")
Пример #6
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 не определена")
Пример #7
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 не определена")
Пример #8
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 не определена")
Пример #9
0
def Find(arg):
    arg_type, arg_value = arg
    if arg_type == "link":
        key = get.entity(arg_value)
        # потом: сделать механизм восходящего поиска
        seg_num = find.attribute(seg_links["system"], "target_namespace")
        res_type, res_num = get.namespace_element(seg_num, key)
        append.memory_stack("link", res_num)
    else:
        raise UndefinedArgument(f"Поведение команды Fnd с аргументом типа "
                                f"{arg_type} не определено")
Пример #10
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 не определена")
Пример #11
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 не определена")
Пример #12
0
def Input():
    global input_data
    if constants.mode == "console":
        value = input()
    elif constants.mode == "editor":
        string, press = QInputDialog.getText(editor, "Ввод",
                                             "Программа запрашивает ввод")
        value = string if press else ""
        constants.input_data = constants.input_data + [value]
    else:
        raise UndefinedBehaviour(f"Неопределённое поведение команды ввода "
                                 f"для режима {constants.mode}")
    num = make.string_segment(value)
    append.memory_stack("link", num)
Пример #13
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} не определено")
Пример #14
0
def Create(arg):
    arg_type, arg_value = arg
    if arg_type == "none":
        res_num = append.data_segment(arg_type, arg_value)
    elif arg_type == "logic":
        res_num = append.data_segment(arg_type, arg_value)
    elif arg_type == "number":
        res_num = append.data_segment(arg_type, arg_value)
    elif arg_type == "chars":
        res_num = make.string_segment(arg_value)
    elif arg_type == "array":
        res_num = make.list_segment(arg_value)
    else:
        raise UndefinedArgument(f"Создание объекта командой Crt типа "
                                f"{arg_type} не определено")
    append.memory_stack("link", res_num)
Пример #15
0
def Output(arg):
    arg_type, arg_value = arg
    if arg_type == "link":
        value_type, value = get.entity(arg_value)
        if value_type == "link":
            arg_value = value
            value_type, value = get.entity(value)
        if constants.mode == "console":
            draw.entity(arg_value)
        elif constants.mode == "editor":
            if value_type == "none":
                value = "none"
            constants.output_data = constants.output_data + [to_string.entity(arg_value)]
        append.memory_stack("link", 0)
    else:
        raise UndefinedBehaviour(f"Поведение команды Out с аргументом типа"
                                 f"{arg_type} не определено")
Пример #16
0
def Length(arg):
    arg_type, arg_value = arg
    if arg_type == "link":
        kind = find.kind(arg_value)
        if kind == "link":
            kind, arg_value = get.entity(arg_value)
            kind = find.kind(arg_value)
        if kind == "string_segment":
            length = get.string_segment_length(arg_value)
        elif kind == "list_segment":
            length = get.list_segment_length(arg_value)
        else:
            raise UndefinedBehaviour(f"Получение длины командой Len для "
                                     f"типа {kind} не определено")
        num = append.data_segment("number", length)
        append.memory_stack("link", num)
    else:
        raise UndefinedArgument(f"Поведение команды Len с аргументом типа "
                                f"{arg_type} не определено")
Пример #17
0
def Equate(receiver, source):
    left_type, left_value = receiver
    if left_type != "link":
        raise UndefinedArgument(f"Приравнивание командой Eqt для приёмника "
                                f"типа {left_type} не определено")
    rec_type, rec_value = link.get_link(left_value)
    if rec_type != "link":
        raise UndefinedBehaviour(f"Приравнивание типа {rec_type} командой Eqt "
                                 f"не определено")
    right_type, right_value = source
    if right_type != "link":
        raise UndefinedArgument(f"Приравнивание командой Eqt для источника "
                                f"типа {right_type} не определено")
    src_type, src_value = link.get_link(right_value)
    if src_type == "link":
        obj_type, obj_value = link.get_link(src_value)
        copy_num = make.entity(obj_type, obj_value)
        write.entity(left_value, "link", copy_num)
    else:
        write.entity(left_value, "link", right_value)
    append.memory_stack("link", 0)
Пример #18
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} не определено")