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)
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)
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])
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]])
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])
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])
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
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)])
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])
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)
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])
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])
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='')
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])
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]))