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
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()
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
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()
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()
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"
def p_lvalue_1(self, p): r'''lvalue : ID''' p[0] = NoneTerminal(p) p[0].place = p[1]