Exemple #1
0
    def p_function_call_1(self, p):
        r'''function_call :   ID function_call_body'''
        global VARIABLES
        p[0] = NoneTerminal(p)
        return_label = Label()
        registers = Register.Registers.copy()
        variables = VARIABLES.copy()
        p[0].code = store_all_registers(registers) + store_all_variables(variables) + "// store return label\n" + push_address(return_label.label)
        p[0].code += "// calc and store function arguments\n"+ p[2].code + store_args(p[2].args)
        p[0].code += "// call function\ngoto " + p[1] + ";\n\n"

        p[0].code += "// return label:\n" + return_label.label + ":;\n"
        p[0].reg = Register("double")
        p[0].code += "// load return value\n" + pop_variable(p[0].reg.place)
        p[0].code += "// load regs and vars\n" + load_all_variables(variables) + load_all_registers(registers)
        p[0].place = p[0].reg.place
Exemple #2
0
 def p_exp_13(self, p):
     r'''exp :   function_call'''
     p[0] = NoneTerminal(p)
     p[0].code = p[1].code
     p[0].place = p[1].get_value()
Exemple #3
0
 def p_exp_12(self, p):
     r'''exp :   LP exp RP'''
     p[0] = NoneTerminal(p)
     p[0].place = p[2].place
     p[0].code = p[2].code
Exemple #4
0
 def p_exp_11(self, p):
     r'''exp :   unary_operation'''
     p[0] = NoneTerminal(p)
     p[0].code = p[1].code
     p[0].place = p[1].get_value()
Exemple #5
0
 def p_exp_8(self, p):
     r'''exp :   logical_operation'''
     p[0] = NoneTerminal(p)
     p[0].code = p[1].code
     p[0].place = p[1].get_value()
Exemple #6
0
 def p_exp_6(self, p):
     r'''exp :   lvalue'''
     p[0] = NoneTerminal(p)
     p[0].place = p[1].place
     p[0].ifexp = "if ( " + p[1].place + " != 0) goto " + TRUE_LABEL + ";\n" + "goto " + FALSE_LABEL + ";\n\n"
Exemple #7
0
 def p_lvalue_1(self, p):
     r'''lvalue :   ID'''
     p[0] = NoneTerminal(p)
     p[0].place = p[1]