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]
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
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
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"
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
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
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]
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
def generate_exp_or_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].false_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].true_list = p[1].true_list + p[3].true_list p[0].false_list = p[3].false_list
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