コード例 #1
0
    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()
コード例 #2
0
    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)
コード例 #3
0
    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
コード例 #4
0
    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)
コード例 #5
0
    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)
コード例 #6
0
 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)
コード例 #7
0
    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("*******************************************************************************")
コード例 #8
0
    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("*******************************************************************************")
コード例 #9
0
 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
コード例 #10
0
 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
コード例 #11
0
 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
コード例 #12
0
 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
コード例 #13
0
 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
コード例 #14
0
 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
コード例 #15
0
 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
コード例 #16
0
 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
コード例 #17
0
 def p_classes_e(self, p):
     """classes : """
     print("""classes ->/* Lambda */""")
     p[0] = Nonterminal()
     p[0].code = ""
     p[0].sym_var = []
コード例 #18
0
 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
コード例 #19
0
    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("********************************************************************************************")
コード例 #20
0
 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
コード例 #21
0
 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
コード例 #22
0
 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