def p_program(self, p): """program : macros classes""" print("""program -> macros classes""") p[0] = Nonterminal() p[0].sym_var = p[2].sym_var print("symbol table list :") print(self.symbol_table_list) include = "#include <stdio.h>" + "\n" include += "#include <stdio.h>" + "\n" if self.t_counter > -1: variables_declaration = "double " for i in range(0, self.t_counter + 1): if i == self.t_counter: variables_declaration += "TT" + str(i) + ";" else: variables_declaration += "TT" + str(i) + ", " else: variables_declaration = "" stack_components_declaration = "void* returnAddress;\ndouble * top = (double*) malloc(1000 * sizeof(double));\nvoid ** labelsTop = (void**) malloc(1000 * sizeof(void*));\ntop += 1000;\nlabelsTop += 1000;" goto_to_main = "goto _main;\n\n" p[0].code = include + "int main()\n{\n\n" + stack_components_declaration + "\n" + variables_declaration + "\n"+ self.variable_decs + goto_to_main + p[2].code + "\n\nend : return 0;\n}" file = open("final_result.c", "w") file.write(p[0].code) file.close()
def p_else_block_1(self, p): r"""else_block : ELSE block %prec PREC2""" print("""else_block : ELSE block %prec PREC2""") p[0] = Nonterminal() p[0].code = p[2].code + "\n" p[0].sym_var = p[2].sym_var self.add_ref(p[0].sym_var, self.new_scope_name()) self.symbol_table_list.append(p[0].sym_var)
def p_elseifs_1(self, p): r"""elseifs : elseifs elseif %prec PREC1""" print("""elseifs : elseifs elseif %prec PREC1""") p[0] = Nonterminal() elseif_label = self.new_label() self.code_generator.back_patch_false(p[1], elseif_label) p[0].code = p[1].code + elseif_label + ": //elseif \n" + p[2].code + "\n" p[0].sym_var = p[1].sym_var + p[2].sym_var
def p_elseif(self, p): r"""elseif : ELSEIF LP exp RP block %prec PREC2""" print("""elseif : ELSEIF LP exp RP block %prec PREC2""") p[0] = Nonterminal() truelabel = self.new_label() self.code_generator.back_patch_true(p[3], truelabel) p[0].code = p[3].code + truelabel + ": //elseif expression\n" + p[5].code + "goto " + self.NEXT_LABEL + "; // next label\n\n" p[0].sym_var = p[5].sym_var self.add_ref(p[0].sym_var, self.new_scope_name()) self.symbol_table_list.append(p[0].sym_var)
def p_func_body(self, p): """func_body : ID LP formal_arguments RP block""" print("""func_body -> ID LP formal_arguments RP block""") p[0] = Nonterminal() return_phrase = "goto end;\n\n" if p[1] == "_main" else CodeGenerator.popReturnAddr(self) + "goto *returnAddress; // return from function\n\n" p[0].code = "//function body ----------- \n" + p[1] + ": //function decleration\n\n" + p[3].code + "\n // function body:\n" + p[5].code + "\n// function ended\n" + return_phrase # self.variable_decs = "" print(p[0].code) p[0].func_name = p[1] p[0].sym_var = p[5].sym_var self.add_ref(p[0].sym_var, self.new_scope_name()) #save a scope self.symbol_table_list.append(p[0].sym_var)
def p_func_dec_2(self, p): """func_dec : STATIC VOID func_body""" print("""func_dec -> STATIC VOID func_body""") p[0] = Nonterminal() p[0].code = p[3].code p[0].sym_var = p[3].sym_var dic = {} dic["ref"] = "NONE" dic["name"] = p[3].func_name dic["type"] = "FUNCTION" dic["v_type"] = "NONE" dic["size"] = "NONE" dic["address"] = "NONE" dic["return_type"] = p[2] p[0].sym_var.append(dic)
def p_for(self, p): """for : FOR LP ID IN exp TO exp STEPS exp RP block""" print("""for -> FOR LP ID IN exp TO exp STEPS exp RP block""") p[0] = Nonterminal() p[0].sym_var = p[11].sym_var self.add_ref(p[0].sym_var, self.new_scope_name()) self.symbol_table_list.append(p[0].sym_var) begin = self.new_label() code_begin = self.new_label() after = self.new_label() initialization = "double " + p[3] + ";\n" + p[3] + " = " + p[5].get_value() + "; // FOR initialization\n" check_bundry = "if ( " + p[3] + " < " + p[7].get_value() + " ) goto " + code_begin + "; // FOR check\n" check_bundry += "goto " + after + ";\n\n" iteration = p[3] + " = " + p[3] + " + " + p[9].get_value() + "; // FOR iteration\n" p[0].code = "// FOR BEGIN\n\n" + p[5].code + p[9].code + initialization + begin + ": // for begin\n\n" + p[7].code + check_bundry + code_begin + ": // for code begin\n" + p[11].code + iteration + "goto " + begin + "; //back to for begin\n\n" + after + ": // end of for\n\n" print("*******************************************************************************") print(p[0].code) print("*******************************************************************************")
def p_while(self, p): """while : WHILE LP exp RP block""" print("""while -> WHILE LP exp RP block""") p[0] = Nonterminal() p[0].sym_var = p[5].sym_var self.add_ref(p[0].sym_var, self.new_scope_name()) self.symbol_table_list.append(p[0].sym_var) begin = self.new_label() code_begin = self.new_label() after = self.new_label() self.code_generator.back_patch_false(p[3], after) self.code_generator.back_patch_true(p[3], code_begin) p[0].code = begin + ": // while begin\n\n" + p[3].code + code_begin + ": // while code begin\n" + p[5].code + "goto " + begin + "; //back to while begin\n\n" + after + ": // end of while\n\n" print("*******************************************************************************") print(p[0].code) print("*******************************************************************************")
def p_elseifs_2(self, p): r"""elseifs : elseif %prec PREC2""" print("""elseifs : elseif %prec PREC2""") p[0] = Nonterminal() p[0].code = p[1].code p[0].sym_var = p[1].sym_var
def p_elseif_blocks_1(self, p): r"""elseif_blocks : elseifs %prec PREC1""" print("""elseif_blocks : elseifs %prec PREC1""") p[0] = Nonterminal() p[0].code = p[1].code p[0].sym_var = p[1].sym_var
def p_class(self, p): """class : CLASS ID LCB symbol_decs RCB""" print("""class -> CLASS ID LCB symbol_decs RCB""") p[0] = Nonterminal() p[0].code = p[4].code p[0].sym_var = p[4].sym_var
def p_statement_5(self, p): """statement : for""" print("""statement -> for""") p[0] = Nonterminal() p[0].code = p[1].code p[0].sym_var = p[1].sym_var
def p_statement_3(self, p): """statement : statement_var_dec""" print("""statement -> statement_var_dec""") p[0] = Nonterminal() p[0].code = p[1].code p[0].sym_var = p[1].sym_var
def p_statements_list(self, p): """statements_list : statements_list statement""" print("""statements_list -> statements_list statement""") p[0] = Nonterminal() p[0].code = p[1].code + p[2].code p[0].sym_var = p[1].sym_var + p[2].sym_var
def p_block_s(self, p): """block : statement""" print("""block -> statement""") p[0] = Nonterminal() p[0].code = p[1].code p[0].sym_var = p[1].sym_var
def p_block(self, p): """block : LCB statements_list RCB""" print("""block -> LCB statements_list RCB""") p[0] = Nonterminal() p[0].code = p[2].code p[0].sym_var = p[2].sym_var
def p_classes_e(self, p): """classes : """ print("""classes ->/* Lambda */""") p[0] = Nonterminal() p[0].code = "" p[0].sym_var = []
def p_statement_6(self, p): """statement : while""" print("""statement -> while""") p[0] = Nonterminal() p[0].code = p[1].code p[0].sym_var = p[1].sym_var
def p_if(self, p): r"""if : IF LP exp RP block elseif_blocks else_block""" print("""if : IF LP exp RP block elseif_blocks else_block""") p[3].code = p[3].ifexp if p[3].ifexp else p[3].code p[0] = Nonterminal() ####sym_table p[0].sym_var = p[5].sym_var + p[6].sym_var + p[7].sym_var self.add_ref(p[0].sym_var, self.new_scope_name()) self.symbol_table_list.append(p[0].sym_var) p[0].true = self.new_label() p[0].next = self.new_label() falselabel = None # back patch true block self.code_generator.back_patch_true(p[3], p[0].true) elseifblock = "" elseblock = "" elselabel = None # create label for else block and set next for it if p[7].code: elselabel = self.new_label() elseblock = elselabel + ": //else\n" + p[7].code elseiflabel = None # check if there is elseif block if p[6].code: elseiflabel = self.new_label() self.code_generator.back_patch_false(p[3], elseiflabel) falselabel = elseiflabel self.code_generator.back_patch_next(p[6], p[0].next) # check for else if p[7].code: self.code_generator.back_patch_false(p[6], elselabel) else: self.code_generator.back_patch_false(p[6], p[0].next) elseifblock = elseiflabel + ": //elseifs\n" + p[6].code # NO elseif check if there is else block elif p[7].code: self.code_generator.back_patch_false(p[3], elselabel) falselabel = elselabel # NO elseif NO else else: self.code_generator.back_patch_false(p[3], p[0].next) falselabel = None true_block = p[0].true + ": " + p[5].code + "goto " + p[0].next + "; //next label\n\n" false_block = "" if falselabel: false_block = elseifblock + elseblock next_block = p[0].next + ": //end of if statement - next\n" p[0].code = "// if statement\n//new\n" + p[3].code + true_block + false_block + next_block print("********************************************************************************************") print(p[0].code) print("********************************************************************************************")
def p_classes(self, p): """classes : classes class""" print("""classes -> classes class""") p[0] = Nonterminal() p[0].code = p[1].code + p[2].code p[0].sym_var = p[1].sym_var + p[2].sym_var
def p_symbol_decs(self, p): """symbol_decs : symbol_decs symbol_dec""" print("""symbol_decs -> symbol_decs symbol_dec""") p[0] = Nonterminal() p[0].code = p[1].code + p[2].code p[0].sym_var = p[1].sym_var + p[2].sym_var
def p_symbol_dec_2(self, p): """symbol_dec : func_dec""" print("""symbol_dec -> func_dec""") p[0] = Nonterminal() p[0].code = p[1].code p[0].sym_var = p[1].sym_var