示例#1
0
def eq_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)

    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    symb2_type, symb2_value = interpret.get_type_and_value_of_symb(
        list(instruction)[2])
    if symb1_value is None or symb2_value is None:
        exit(56)

    if symb1_type == 'nil' or symb2_type == 'nil':
        if symb1_type == symb2_type:
            var_frame[var_name] = tuple(['bool', True])
        else:
            var_frame[var_name] = tuple(['bool', False])
    elif symb1_type != symb2_type:
        exit(53)
    elif symb1_type == 'bool':
        var_frame[var_name] = tuple(
            ['bool', str(symb1_value) == str(symb2_value)])
    elif symb1_type == 'string':
        symb1_value = replace_escape_sequences(symb1_value)
        symb2_value = replace_escape_sequences(symb2_value)
        var_frame[var_name] = tuple(['bool', symb1_value == symb2_value])
    elif symb1_type == 'int':
        var_frame[var_name] = tuple(['bool', symb1_value == symb2_value])
    else:
        exit(53)
示例#2
0
def jumpifneq_i(interpret: i.Interpret, instruction):
    label_name = list(instruction)[0].text
    if label_name not in interpret.label_dict.keys():
        exit(52)

    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    symb2_type, symb2_value = interpret.get_type_and_value_of_symb(
        list(instruction)[2])
    if symb1_value is None or symb2_value is None:
        exit(56)

    if symb1_type == 'nil' or symb2_type == 'nil':
        if symb1_type != symb2_type:
            interpret.inst_index = interpret.label_dict[label_name]
    elif symb1_type != symb2_type:
        exit(53)
    elif symb1_type == 'bool':
        if str(symb1_value) != str(symb2_value):
            interpret.inst_index = interpret.label_dict[label_name]
    elif symb1_type == 'string':
        symb1_value = replace_escape_sequences(symb1_value)
        symb2_value = replace_escape_sequences(symb2_value)
        if symb1_value != symb2_value:
            interpret.inst_index = interpret.label_dict[label_name]
    elif symb1_type == 'int':
        if symb1_value != symb2_value:
            interpret.inst_index = interpret.label_dict[label_name]
    else:
        exit(53)
示例#3
0
def concat_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)

    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    symb2_type, symb2_value = interpret.get_type_and_value_of_symb(
        list(instruction)[2])
    if symb1_value is None or symb2_value is None:
        exit(56)
    if symb1_type != 'string' or symb2_type != 'string':
        exit(53)

    var_frame[var_name] = tuple([symb1_type, symb1_value + symb2_value])
示例#4
0
def getchar_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)

    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    symb2_type, symb2_value = interpret.get_type_and_value_of_symb(
        list(instruction)[2])
    if symb1_value is None or symb2_value is None:
        exit(56)
    if symb1_type != 'string' or symb2_type != 'int':
        exit(53)
    if 0 > symb2_value or symb2_value > len(symb1_value) - 1:
        exit(58)
    var_frame[var_name] = tuple([symb1_type, symb1_value[symb2_value]])
示例#5
0
def mul_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)

    symb1_type, symb1_val = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    symb2_type, symb2_val = interpret.get_type_and_value_of_symb(
        list(instruction)[2])
    if symb1_val is None or symb2_val is None:
        exit(56)
    if symb1_type != 'int' or symb2_type != 'int':
        exit(53)
    result = symb1_val * symb2_val

    var_frame[var_name] = tuple([symb1_type, result])
示例#6
0
def move_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)
    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    if symb1_value is None:
        exit(56)
    var_frame[var_name] = tuple([symb1_type, symb1_value])
示例#7
0
def stri2int_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)
    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    symb2_type, symb2_value = interpret.get_type_and_value_of_symb(
        list(instruction)[2])

    if symb1_value is None or symb2_value is None:
        exit(56)
    if symb1_type != 'string' or symb2_type != 'int':
        exit(53)
    if 0 > symb2_value or symb2_value > len(symb1_value) - 1:
        exit(58)
    try:
        var_frame[var_name] = tuple(['int', ord(symb1_value[symb2_value])])
    except:
        exit(58)  # mozna jiny kod, neni specifikovano jak se ma ukoncit
示例#8
0
def strlen_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)
    symb1_type, symb1_val = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    if symb1_val is None:
        exit(56)
    if symb1_type != 'string':
        exit(53)
    var_frame[var_name] = tuple(['int', len(symb1_val)])
示例#9
0
def setchar_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)
    var_type, var_value = interpret.get_type_and_value_of_var(
        list(instruction)[0])
    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    symb2_type, symb2_value = interpret.get_type_and_value_of_symb(
        list(instruction)[2])
    if symb1_value is None or symb2_value is None or var_value is None:
        exit(56)
    if symb1_type != 'int' or symb2_type != 'string' or var_type != 'string':
        exit(53)
    if 0 > symb1_value or symb1_value > len(var_value) - 1 or len(
            symb2_value) == 0:
        exit(58)
    symb2_value = replace_escape_sequences(symb2_value)
    result = var_value[:symb1_value] + symb2_value[0] + var_value[symb1_value +
                                                                  1:]
    var_frame[var_name] = tuple([symb2_type, result])
示例#10
0
def exit_i(interpret: i.Interpret, instruction):
    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[0])
    if symb1_value is None:
        exit(56)
    if symb1_type != 'int':
        exit(53)
    if 0 <= symb1_value <= 49:
        exit(symb1_value)
    else:
        exit(57)
示例#11
0
def type_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)

    symb1_type, symb1_val = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    if symb1_type in ['int', 'nil', 'bool']:
        symb1_val = symb1_type
    elif symb1_val is None:
        symb1_val = ''
    else:
        symb1_val = 'string'

    var_frame[var_name] = tuple(['string', symb1_val])
示例#12
0
def int2char_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)
    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    if symb1_value is None:
        exit(56)
    if symb1_type != 'int':
        exit(53)
    try:
        symb1_value = chr(symb1_value)
    except:
        exit(58)
    var_frame[var_name] = tuple(['string', symb1_value])
示例#13
0
def dprint_i(interpret: i.Interpret, instruction):
    symb_type, symb_value = interpret.get_type_and_value_of_symb(
        list(instruction)[0])
    if symb_value is None:
        exit(56)
    if symb_type == 'nil':
        print('', file=sys.stderr, end='')
    elif symb_type == 'bool':
        print(str(symb_value).lower(), file=sys.stderr, end='')
    elif symb_type == 'string':
        symb_value = replace_escape_sequences(symb_value)
        print(symb_value, file=sys.stderr, end='')
    else:
        print(symb_value, file=sys.stderr, end='')
示例#14
0
def read_i(interpret: i.Interpret, instruction):
    var_frame, var_name = var_prepare(instruction, interpret)
    symb1_type, symb1_value = interpret.get_type_and_value_of_symb(
        list(instruction)[1])
    if symb1_value is None:
        exit(56)
    if symb1_type != 'type' or symb1_value not in ['int', 'bool', 'string']:
        exit(53)

    if interpret.input_data is not None:
        try:
            read_input = interpret.input_data.pop(0)
            read_input = read_input.rstrip('\n\r')
        except:
            symb1_value = 'nil'
            read_input = 'nil'
    else:
        try:
            read_input = input()
        except:
            symb1_value = 'nil'
            read_input = 'nil'
    try:
        if symb1_value == 'int':
            try:
                read_input = int(read_input)
            except:
                read_input = 'nil'
                symb1_value = 'nil'
        elif symb1_value == 'string':
            try:
                read_input = str(read_input)
            except:
                read_input = 'nil'
                symb1_value = 'nil'
        elif symb1_value == 'bool':
            read_input = read_input.lower()
            if read_input == 'true':
                read_input = True
            else:
                read_input = False
    except:
        symb1_value = 'nil'
        read_input = 'nil'

    var_frame[var_name] = tuple([symb1_value, read_input])
示例#15
0
def pushs_i(interpret: i.Interpret, instruction):
    symb_type, symb_value = interpret.get_type_and_value_of_symb(
        list(instruction)[0])
    if symb_value is None:
        exit(56)
    interpret.data_stack.append(tuple([symb_type, symb_value]))