Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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]
Exemplo n.º 4
0
def return_i(interpret: i.Interpret, instruction):
    if len(interpret.call_stack) == 0:
        exit(56)
    interpret.inst_index = interpret.call_stack.pop()
Exemplo n.º 5
0
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]