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")
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")
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")
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} не определено")
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 не определена")
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 не определена")
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 не определена")
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 не определена")
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} не определено")
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 не определена")
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 не определена")
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)
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} не определено")
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)
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} не определено")
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} не определено")
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)
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} не определено")