示例#1
0
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
示例#2
0
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"
示例#3
0
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)
示例#4
0
def generate_main():
    q = quad.Quad()
    q.set_quad("goto", None, "main", None)
    state.quads.append(q)
示例#5
0
def print_quad(printable):
    qd = quad.Quad()
    qd.set_quad("print", None, printable, None)
    # state.operand_stack.append(qd.result)
    state.quads.append(qd)
示例#6
0
def generate_if_goto_f(exp):
    q = quad.Quad()
    q.set_quad("gotoFalse", None, exp, None)
    state.quads.append(q)
示例#7
0
def generate_loop_goto(label):
    q = quad.Quad()
    # revisar este pedo
    q.set_quad("goto", None, None, label + 1)
    state.quads.append(q)
示例#8
0
def generate_else_goto():
    q = quad.Quad()
    q.set_quad("goto", None, None, None)
    state.quads.append(q)
示例#9
0
def generate_era(func_name, res):
    q = quad.Quad()
    q.set_quad("era", None, func_name, res)
    state.quads.append(q)
示例#10
0
def generate_end(func_name):
    q = quad.Quad()
    q.set_quad("end", None, func_name, None)
    state.quads.append(q)
示例#11
0
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)
示例#12
0
def generate_param(op1):
    q = quad.Quad()
    q.set_quad("param", None, op1, state.param_counter)
    state.quads.append(q)
    state.param_counter += 1