def set_quad(self, op, op2, op1, res): self.operator = op self.operand2 = op2 self.operand1 = op1 if (op2 == None): if (op == "="): res[1][0] = sem.get_type(op, res, op1) elif (op == "u+" or op == "u-"): if (op1[1][0][0] != "i" and op1[1][0][0] != "f"): raise NameError("Number expected, '{0}' received".format( op1[1][0])) size = 4 res = [res, [op1[1][0], state.temp_dir, [size, 1], 't']] state.temp_dir -= size elif (op == "u!"): if (op1[1][0][0] != "b"): raise NameError("Boolean expected, '{0}' received".format( op1[1][0])) size = 1 res = [res, [op1[1][0], state.temp_dir, [size, 1], 't']] state.temp_dir -= size self.result = res else: if (op == "len"): size = 4 res = [res, ["int", state.temp_dir, [size, 1], 't']] else: type = sem.get_type(op, op1, op2) if (type[0] == "i" or type[0] == "f"): size = 4 else: size = 1 res = [res, [type, state.temp_dir, [size, 1], 't']] state.temp_dir -= size self.result = res
def set_quad(self, op, op2, op1, res): self.operator = op self.operand2 = op2 self.operand1 = op1 if(op2 == None): if(op == "="): res[1][0] = sem.get_type(op, res, op1) elif(op == "u+" or op == "u-"): if(op1[1][0][0] != "i" and op1[1][0][0] != "f"): raise NameError("Number expected, '{0}' received".format(op1[1][0])) size = 4 res = [res, [op1[1][0], state.temp_dir, [size, 1], 't']] state.temp_dir -= size elif(op == "u!"): if(op1[1][0][0] != "b"): raise NameError("Boolean expected, '{0}' received".format(op1[1][0])) size = 1 res = [res, [op1[1][0], state.temp_dir, [size, 1], 't']] state.temp_dir -= size self.result = res else: if(op == "len"): size = 4 res = [res, ["int", state.temp_dir, [size, 1], 't']] else: type = sem.get_type(op, op1, op2) if(type[0] == "i" or type[0] == "f"): size = 4 else: size = 1 res = [res, [type, state.temp_dir, [size, 1], 't']] state.temp_dir -= size self.result = res
def create_quad(op, op2, op1, res): quad = Quad() quad.operator = op quad.operand2 = op2 quad.operand1 = op1 if(op2 == None): if(op =="read" or op =="print"): #quad.result = op2 quad.result = res else: res[1][0] = sem.get_type(op, op1, res) quad.result = res else: quad.result = [res, [sem.get_type(op, op1, op2)]] return quad
def create_quad(op, op2, op1, res): quad = Quad() quad.operator = op quad.operand2 = op2 quad.operand1 = op1 if (op2 == None): if (op == "read" or op == "print"): #quad.result = op2 quad.result = res else: res[1][0] = sem.get_type(op, op1, res) quad.result = res else: quad.result = [res, [sem.get_type(op, op1, op2)]] return quad
def generate_quad(hierarchy): q = quad.Quad() if(hierarchy == 0): if(state.last_operator == 'u+' or state.last_operator == 'u-' or state.last_operator == 'u!'): q.set_quad(state.operator_stack.pop(), None, state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 1) state.temp_counter += 1 elif(hierarchy == 1): if(state.last_operator == '*' or state.last_operator == '/'): # id, [type, address, size] q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif(hierarchy == 2): if(state.last_operator == '+' or state.last_operator == '-'): q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif(hierarchy == 3): if(state.last_operator == '==' or state.last_operator == '<=' or state.last_operator == '>=' or state.last_operator == '<>' or state.last_operator == '<' or state.last_operator == '>'): q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif(hierarchy == 4): if(state.last_operator == '&&' or state.last_operator == '||'): q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif(hierarchy == 5): if(state.last_operator == '='): q.set_quad(state.operator_stack.pop(), None, state.operand_stack.pop(), state.operand_stack.pop()) set_assign_type(sem.get_type("=", ["", [state.assign_list[0]]], ["", [q.result[1][0]]]), 1) if(q.operator != None): state.quads.append(q) if(q.operator != "="): state.operand_stack.append(q.result) #state.assign_list.append(q.result[1][0]) else: del(q) 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 generate_quad(hierarchy): q = quad.Quad() if (hierarchy == 0): if (state.last_operator == 'u+' or state.last_operator == 'u-' or state.last_operator == 'u!'): q.set_quad(state.operator_stack.pop(), None, state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 1) state.temp_counter += 1 elif (hierarchy == 1): if (state.last_operator == '*' or state.last_operator == '/'): # id, [type, address, size] q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif (hierarchy == 2): if (state.last_operator == '+' or state.last_operator == '-'): q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif (hierarchy == 3): if (state.last_operator == '==' or state.last_operator == '<=' or state.last_operator == '>=' or state.last_operator == '<>' or state.last_operator == '<' or state.last_operator == '>'): q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif (hierarchy == 4): if (state.last_operator == '&&' or state.last_operator == '||'): q.set_quad(state.operator_stack.pop(), state.operand_stack.pop(), state.operand_stack.pop(), "t" + str(state.temp_counter)) set_assign_type(q.result[1][0], 2) state.temp_counter += 1 elif (hierarchy == 5): if (state.last_operator == '='): q.set_quad(state.operator_stack.pop(), None, state.operand_stack.pop(), state.operand_stack.pop()) set_assign_type( sem.get_type("=", ["", [state.assign_list[0]]], ["", [q.result[1][0]]]), 1) if (q.operator != None): state.quads.append(q) if (q.operator != "="): state.operand_stack.append(q.result) #state.assign_list.append(q.result[1][0]) else: del (q) 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