def generate_quad(hierarchy): qd = quad.Quad() if(hierarchy == 0 and (state.last_operator == 's+' or state.last_operator == 's-')): qd.set_quad(state.operator_stack.pop(), None, state.operand_stack.pop(), state.operand_stack.pop()) state.temp_counter += 1 elif(hierarchy == 1 and (state.last_operator == '*' or state.last_operator == '/')): qd.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) state.temp_counter += 1 elif(hierarchy == 2 and (state.last_operator == '+' or state.last_operator == '-')): qd.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) state.temp_counter += 1 elif(hierarchy == 3 and (state.last_operator == '==' or state.last_operator == '<=' or state.last_operator == '>=' or state.last_operator == '<>' or state.last_operator == '<' or state.last_operator == '>')): qd.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) state.temp_counter += 1 elif(hierarchy == 5 and (state.last_operator == '=')): qd.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) state.temp_counter += 1 if(qd.operator != None): state.quads.append(qd) state.operand_stack.append(qd.result) else: del(qd) if(len(state.operator_stack) > 0): state.last_operator = state.operator_stack[-1] if(state.last_operator == '#'): state.last_operator = None else: state.last_operator = None
def read_quad(type, var, scope): if (type == sem.var_table[scope][var][0]): qd = quad.Quad() qd.set_quad("read", None, "t" + str(state.temp_counter), var) # state.operand_stack.append(qd.result) state.quads.append(qd) state.temp_counter += 1 else: print "incompatible"
def generate_return(func_name, op1): q = quad.Quad() #type = op1[1][0] #if(type[0] == "i" or type[0] == "f"): # size = 4 #else: # size = 1 #var = [func_name, [type, 0, size, 't']] # Revisar este pedo #state.return_var_stack.append(var) #q.set_quad("return", None, op1, var) q.set_quad("return", None, op1, None) state.quads.append(q)
def generate_main(): q = quad.Quad() q.set_quad("goto", None, "main", None) state.quads.append(q)
def print_quad(printable): qd = quad.Quad() qd.set_quad("print", None, printable, None) # state.operand_stack.append(qd.result) state.quads.append(qd)
def generate_if_goto_f(exp): q = quad.Quad() q.set_quad("gotoFalse", None, exp, None) state.quads.append(q)
def generate_loop_goto(label): q = quad.Quad() # revisar este pedo q.set_quad("goto", None, None, label + 1) state.quads.append(q)
def generate_else_goto(): q = quad.Quad() q.set_quad("goto", None, None, None) state.quads.append(q)
def generate_era(func_name, res): q = quad.Quad() q.set_quad("era", None, func_name, res) state.quads.append(q)
def generate_end(func_name): q = quad.Quad() q.set_quad("end", None, func_name, None) state.quads.append(q)
def generate_gosub(func_name): q = quad.Quad() # revisar este pedo quitar sem de esta clase q.set_quad("gosub", None, func_name, sem.get_function(func_name)[2]) state.quads.append(q)
def generate_param(op1): q = quad.Quad() q.set_quad("param", None, op1, state.param_counter) state.quads.append(q) state.param_counter += 1