def _getchar(context, dest: Arg, string: Arg, idx: Arg): try: dest.set_value(context, string.get_value(context)[idx.get_value(context)]) except IndexError: raise StringOperationError("Neplatný index {}".format( idx.get_value(context)))
def _int2char(context, dest: Arg, idx: Arg): try: dest.set_value(context, chr(idx.get_value(context))) except ValueError: raise StringOperationError( "Neplatná ordinální hodnota Unicode: {}".format( idx.get_value(context)))
def _stri2int(context, dest: Arg, src_str: Arg, idx: Arg): try: dest.set_value(context, ord(src_str.get_value(context)[idx.get_value(context)])) except IndexError: raise StringOperationError("Neplatný index {}".format( idx.get_value(context)))
def _setchar(context, dest: Arg, idx: Arg, src: Arg): val = dest.get_value(context) index = idx.get_value(context) src_val = src.get_value(context) if index >= len(val) or index < 0: raise StringOperationError("Neplatný index {}".format(index)) if len(src_val) == 0: raise StringOperationError("Prázdný zdrojový řetězec") val = val[:index] + src_val[0] + val[index + 1:] dest.set_value(context, val)
def from_xml_dom(inst_dom: Element): """ Parse instruction from XML DOM element :param inst_dom: instruction XML DOM element :return: new Instruction instance loaded from XML """ opcode = inst_dom.attrib['opcode'] args = list() for arg in inst_dom: if arg.text is None: arg.text = '' args.append(Arg(arg.attrib['type'], arg.text)) return Instruction(opcode, args)
def _jumpifneq(context, label: Arg, op1: Arg, op2: Arg): _check_if_same_type(context, op1, op2) if op1.get_value(context) != op2.get_value(context): context.jump_to_label(label.get_value(context))
def _type(context, dest: Arg, src: Arg): dest.set_value(context, src.get_data_type(context))
def _jump(context, label: Arg): context.jump_to_label(label.get_value(context))
def _pushs(context, symb: Arg): context.data_push(symb.get_value(context))
def _move(context, dest: Arg, src: Arg): dest.set_value(context, src)
def _write(context, symb: Arg): print(symb.to_str(context))
def _strlen(context, dest: Arg, string: Arg): dest.set_value(context, len(string.get_value(context)))
def _check_if_same_type(context, arg1: Arg, arg2: Arg): if arg1.get_data_type(context) != arg2.get_data_type(context): raise OperandTypeError("Argumenty musí být stejného typu".format( context.get_current_inst().opcode, context.get_inst_number()))
def _dprint(context, symb: Arg): print(symb.to_str(context), file=sys.stderr)
def _pops(context, var: Arg): var.set_value(context, context.data_pop())
def _not(context, dest: Arg, op1: Arg): dest.set_value(context, not op1.get_value(context))
def _idiv(context, dest: Arg, op1: Arg, op2: Arg): if op2.get_value(context) == 0: raise DivisionByZeroError("Pokus o dělení nulou") _binary_operation(context, dest, op1, op2, operator.floordiv)
def _read(context, var: Arg, in_type: Arg): try: read = input() except EOFError: if in_type.value == 'int': var.set_value(context, 0) elif in_type.value == 'string': var.set_value(context, '') else: var.set_value(context, False) return if in_type.value == 'int': try: var.set_value(context, int(read)) except ValueError: var.set_value(context, 0) elif in_type.value == 'string': var.set_value(context, read) else: if read.lower() == 'true': var.set_value(context, True) else: var.set_value(context, False)
def _binary_operation(context, dest: Arg, op1: Arg, op2: Arg, op): dest.set_value(context, op(op1.get_value(context), op2.get_value(context)))