Ejemplo n.º 1
0
    def generate_elseiflist_code(self, p, q1, q2, q3, q4, q5):
        if not isinstance(p[4], LogicTerminal):
            p[4] = self.arith_to_logic(q4, q5, p[4])

        p[0] = LogicTerminal()
        if p[4].address:
            q2 = p[4].address
        p[1].false_list_back_patch(q2)
        if p[1].code:
            p[0].address = p[1].address
            p[0].code = p[1].code + q1 + ": goto -;\n"
        else:
            p[0].address = q2
            p[0].code = ""
        if p[6].address:
            q3 = p[6].address
        p[4].true_list_back_patch(q3)
        if p[4].address:
            p[0].code += p[4].code
        else:
            p[0].code += q2 + ": goto -;\n" + p[4].code
        if p[6].address:
            p[0].code += p[6].code
        else:
            p[0].code += q3 + ": " + p[6].code
        p[0].true_list = p[1].true_list + p[6].next_list + [q1]
        p[0].false_list = p[4].false_list
Ejemplo n.º 2
0
    def generate_stmt_foreach_code(self, p, q1, q2, q3, q4, q5, temp, temp2,
                                   temp3, temp4):
        dec = 'int ' + p[3] + ';\n'
        if dec not in self.variables:
            self.variables += dec
        self.variables += 'int ' + temp + ';\n'
        self.variables += 'int ' + temp2 + ';\n'
        self.variables += 'int ' + temp3 + ';\n'
        self.variables += 'int ' + temp4 + ';\n'

        iteration_exp = LogicTerminal()
        iteration_exp.address = q3
        iteration_exp.code += q3 + ": if (" + temp2 + ' < ' + temp4 + ") goto -;\n"
        iteration_exp.code += q4 + ": goto -;\n"
        iteration_exp.true_list = [q3]
        iteration_exp.false_list = [q4]

        p[0] = StatementTerminal()
        p[0].code = temp + ' = ' + p[
            5] + ';\n' + temp3 + ' = arr[' + temp + '];\n' + temp2 + ' = ' + temp + ' + 1;\n' + temp4 + ' = ' + temp2 + ' + ' + temp3 + ';\n'
        if iteration_exp.address:
            q1 = iteration_exp.address
        p[7].next_list_back_patch(q5)
        iteration_exp.true_list_back_patch(q2)
        if iteration_exp.address:
            p[0].code += iteration_exp.code
        else:
            p[0].code += q1 + ": " + iteration_exp.code
        p[0].code += q2 + ": " + p[3] + ' = arr[' + temp2 + '];\n' + p[7].code
        p[0].code += q5 + ": " + temp2 + " = " + temp2 + " + 1;\ngoto " + q1 + ";\n"
        p[0].next_list = iteration_exp.false_list
Ejemplo n.º 3
0
 def generate_relopexp_code(self, p, q1, q2):
     p[0] = LogicTerminal()
     if p[1].code:
         p[0].address = p[1].address
     elif p[3].code:
         p[0].address = p[3].address
     else:
         p[0].address = q1
     p[0].code += p[1].code + p[3].code
     p[0].code += q1 + ": if (" + p[1].get_value(
     ) + ' ' + p[2] + ' ' + p[3].get_value() + ") goto -;\n"
     p[0].code += q2 + ": goto -;\n"
     p[0].true_list = [q1]
     p[0].false_list = [q2]
     p[0].right_most_exp = p[3]
Ejemplo n.º 4
0
 def generate_stmt_const_code(self, p, q):
     p[0] = LogicTerminal()
     p[0].address = q
     if p[1] == 'True':
         p[0].true_list = [q]
     else:
         p[0].false_list = [q]
     p[0].code = q + ": goto -;\n"
Ejemplo n.º 5
0
    def generate_exp_not_code(self, p, q1, q2):
        if not isinstance(p[2], LogicTerminal):
            p[2] = self.arith_to_logic(q1, q2, p[2])

        p[0] = LogicTerminal()
        p[0].address = p[2].address
        p[0].code = p[2].code
        p[0].true_list = p[2].false_list
        p[0].false_list = p[2].true_list
Ejemplo n.º 6
0
 def arith_to_logic(self, q1, q2, p):
     temp_terminal = LogicTerminal()
     if p.code:
         temp_terminal.address = p.address
     else:
         temp_terminal.address = q1
     temp_terminal.code = p.code
     temp_terminal.code += q1 + ": if (" + p.get_value(
     ) + " != 0) goto -;\n"
     temp_terminal.code += q2 + ": goto -;\n"
     temp_terminal.true_list = [q1]
     temp_terminal.false_list = [q2]
     return temp_terminal
Ejemplo n.º 7
0
 def generate_cases_code(self, p, q1, q2):
     p[0] = LogicTerminal()
     if p[2].address:
         q2 = p[2].address
     p[1].false_list_back_patch(q2)
     if p[1].code:
         p[0].address = p[1].address
         p[0].code = p[1].code + q1 + ": goto -;\n"
     else:
         p[0].address = q2
         p[0].code = ""
     if p[2].address:
         p[0].code += p[2].code
     else:
         p[0].code += q2 + ': ' + p[2].code
     p[0].true_list = p[1].true_list + [q1]
     p[0].false_list = p[2].false_list
Ejemplo n.º 8
0
    def generate_exp_and_code(self, p, q1, q2, q3, q4, q5):
        if not isinstance(p[1], LogicTerminal):
            p[1] = self.arith_to_logic(q1, q2, p[1])
        if not isinstance(p[3], LogicTerminal):
            p[3] = self.arith_to_logic(q3, q4, p[3])

        p[0] = LogicTerminal()
        p[0].address = p[1].address
        if p[3].address:
            q5 = p[3].address
        p[1].true_list_back_patch(q5)
        if p[3].address:
            p[0].code = p[1].code + p[3].code
        else:
            p[0].code = p[1].code + q5 + ": " + p[3].code
        p[0].false_list = p[1]
        p[0].false_list = p[1].false_list + p[3].false_list
        p[0].true_list = p[3].true_list
Ejemplo n.º 9
0
    def generate_case_code(self, p, q1, q2, q3):
        logical_exp = LogicTerminal()
        logical_exp.address = q1
        logical_exp.code += q1 + ": if (" + p[2].get_value(
        ) + " == $) goto -;\n"
        logical_exp.code += q2 + ": goto -;\n"
        logical_exp.true_list = [q1]
        logical_exp.false_list = [q2]

        p[0] = LogicTerminal()
        p[0].address = logical_exp.address
        if p[4].address:
            q3 = p[4].address
        logical_exp.true_list_back_patch(q3)
        p[0].code = logical_exp.code
        if p[4].address:
            p[0].code += p[4].code
        else:
            p[0].code += q3 + ': ' + p[4].code
        p[0].false_list = logical_exp.false_list
Ejemplo n.º 10
0
 def generate_cases_empty_code(self, p):
     p[0] = LogicTerminal()
Ejemplo n.º 11
0
 def generate_elseiflist_empty_code(self, p):
     p[0] = LogicTerminal()
Ejemplo n.º 12
0
    def generate_relopexp_rel_code(self, p, q1, q2, q3):
        temp_terminal = LogicTerminal()
        if p[3].code:
            temp_terminal.address = p[3].address
        else:
            temp_terminal.address = q1
        temp_terminal.code = p[3].code
        temp_terminal.code += q1 + ": if (" + p[1].right_most_exp.get_value(
        ) + ' ' + p[2] + ' ' + p[3].get_value() + ") goto -;\n"
        temp_terminal.code += q2 + ": goto -;\n"
        temp_terminal.true_list = [q1]
        temp_terminal.false_list = [q2]

        p[0] = LogicTerminal()
        p[0].address = p[1].address
        if temp_terminal.address:
            q3 = temp_terminal.address
        p[1].true_list_back_patch(q3)
        if temp_terminal.address:
            p[0].code = p[1].code + temp_terminal.code
        else:
            p[0].code = p[1].code + q3 + ': ' + temp_terminal.code
        p[0].false_list = p[1]
        p[0].false_list = p[1].false_list + temp_terminal.false_list
        p[0].true_list = temp_terminal.true_list
        p[0].right_most_exp = p[3]