def jumpifneqs_i(interpret: i.Interpret, instruction): label_name = list(instruction)[0].text if label_name not in interpret.label_dict.keys(): exit(52) symb2_type, symb2_value = interpret.data_stack.pop() if len(interpret.data_stack) == 0: exit(56) symb1_type, symb1_value = interpret.data_stack.pop() 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 jumpifeq_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 call_i(interpret: i.Interpret, instruction): if list(instruction)[0].text not in interpret.label_dict.keys(): exit(52) interpret.call_stack.append(interpret.inst_index) interpret.inst_index = interpret.label_dict[list(instruction)[0].text]
def return_i(interpret: i.Interpret, instruction): if len(interpret.call_stack) == 0: exit(56) interpret.inst_index = interpret.call_stack.pop()
def jump_i(interpret: i.Interpret, instruction): if list(instruction)[0].text not in interpret.label_dict.keys(): exit(52) interpret.inst_index = interpret.label_dict[list(instruction)[0].text]