コード例 #1
0
ファイル: oaf_quad.py プロジェクト: juvs91/compilador
 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
コード例 #2
0
ファイル: oaf_quad.py プロジェクト: juvs91/compilador
 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
コード例 #3
0
ファイル: create_quad.py プロジェクト: juvs91/compilador
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
コード例 #4
0
ファイル: create_quad.py プロジェクト: juvs91/compilador
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
コード例 #5
0
ファイル: oaf_expr.py プロジェクト: juvs91/compilador
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
コード例 #6
0
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