Beispiel #1
0
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)))
Beispiel #2
0
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)))
Beispiel #3
0
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)))
Beispiel #4
0
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)
Beispiel #5
0
    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)
Beispiel #6
0
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))
Beispiel #7
0
def _type(context, dest: Arg, src: Arg):
    dest.set_value(context, src.get_data_type(context))
Beispiel #8
0
def _jump(context, label: Arg):
    context.jump_to_label(label.get_value(context))
Beispiel #9
0
def _pushs(context, symb: Arg):
    context.data_push(symb.get_value(context))
Beispiel #10
0
def _move(context, dest: Arg, src: Arg):
    dest.set_value(context, src)
Beispiel #11
0
def _write(context, symb: Arg):
    print(symb.to_str(context))
Beispiel #12
0
def _strlen(context, dest: Arg, string: Arg):
    dest.set_value(context, len(string.get_value(context)))
Beispiel #13
0
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()))
Beispiel #14
0
def _dprint(context, symb: Arg):
    print(symb.to_str(context), file=sys.stderr)
Beispiel #15
0
def _pops(context, var: Arg):
    var.set_value(context, context.data_pop())
Beispiel #16
0
def _not(context, dest: Arg, op1: Arg):
    dest.set_value(context, not op1.get_value(context))
Beispiel #17
0
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)
Beispiel #18
0
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)
Beispiel #19
0
def _binary_operation(context, dest: Arg, op1: Arg, op2: Arg, op):
    dest.set_value(context, op(op1.get_value(context), op2.get_value(context)))