Example #1
0
def fill_repeat():
    '''Repeat function helper, the control variable is updated'''
    false = jump_stack.pop()
    ret = jump_stack.pop()
    counter = Var('int', quadruples[ret - 2][4], quadruples_addr[ret - 2][4])
    one_addr = symbol_table.insert_cte('int', 1)
    one_var = Var('int', 1, one_addr)
    res = gen_quad_exp('-', counter, one_var)
    gen_quad_assig(counter, res)
    gen_quad('GOTO', '', '', ret)
    mod_quad(false, 4, quad_pos())
Example #2
0
def gen_repeat(n):
    '''Repeat function is a while that initializes its control variable
    with user's input and updates it with every cycle subtracting one'''
    global temp_pos
    temp = 'temp' + str(temp_pos)
    temp_addr = insert_temp('int', temp)
    temp_var = Var('int', temp, temp_addr)
    temp_pos += 1
    gen_quad_assig(temp_var, n)
    jump_stack.append(quad_pos())
    zero_addr = symbol_table.insert_cte('int', 0)
    zero_var = Var('int', 0, zero_addr)
    res = gen_quad_exp('>', temp_var, zero_var)
    gen_gotof(res)
Example #3
0
def p_cte_arr(p):
    '''cte_arr : ID LSQBRACE expresion RSQBRACE'''
    base = utils.id_lookup(p[1] + '-base')
    code_generator.gen_quad_addr('VER', p[3].addr, '', p[1])
    code_generator.gen_quad_name('VER', p[3].value, '', p[1])
    var = code_generator.gen_quad_exp('+', p[3], base)
    new_var = Var(var.type, '(' + str(var.value) + ')',
                  '(' + str(var.addr) + ')')
    p[0] = new_var
Example #4
0
def get_return(func_name):
    '''Gets return value from previous evaluated function and sets to temp'''
    return_exp = utils.id_lookup(func_name)
    global temp_pos
    temp_name = 'temp' + str(temp_pos)
    temp_addr = insert_temp(return_exp.type, temp_name)
    temp_pos += 1
    temp_var = Var(return_exp.type, temp_name, temp_addr)
    gen_quad_assig(temp_var, return_exp)
    return temp_var
Example #5
0
def p_varAux1(p):
    '''varAux1 : tipo varAux2 SEMICOLON
               | tipo varAux2 SEMICOLON varAux1'''
    for var in p[2]:
        if (utils.context == 'global'):
            if ('qty' in var):
                name = var['name'] + '-0'
                new_var = symbol_table.insert_global_var(name, p[1])
                for i in range(1, var['qty']):
                    name = var['name'] + '-' + str(i)
                    symbol_table.insert_global_var(name, p[1])
                symbol_table.insert_global_var(var['name'] + '-base', 'int',
                                               new_var.addr)
            else:
                new_var = symbol_table.insert_global_var(
                    var['name'], p[1], var['name'], var['type'])

            if (var['value'] or var['value'] == 0):
                exp = Var(var['type'], var['value'], var['addr'])
                code_generator.gen_quad_assig(new_var, exp)
        else:
            if ('qty' in var):
                name = var['name'] + '-0'
                new_var = symbol_table.insert_local_var(
                    utils.context, name, p[1])
                for i in range(1, var['qty']):
                    name = var['name'] + '-' + str(i)
                    symbol_table.insert_local_var(utils.context, name, p[1])
                symbol_table.insert_global_var(var['name'] + '-base', 'int',
                                               new_var.addr)
            else:
                new_var = symbol_table.insert_local_var(
                    utils.context, var['name'], p[1], var['name'], var['type'])

            if (var['value'] or var['value'] == 0):
                exp = Var(var['type'], var['value'], var['addr'])
                code_generator.gen_quad_assig(new_var, exp)
Example #6
0
def gen_quad_exp(op, op1, op2):
    '''Evaluates expression and assigns to temporal'''
    type = cube[op][op1.type][op2.type]  #Validates type on sem cube

    if (type == 'error'):
        type_mismatch(op1.value, op, op2.value)
        sys.exit()
    else:
        global temp_pos
        temp = 'temp' + str(temp_pos)
        temp_addr = insert_temp(type, temp)  # Creates temporary
        gen_quad_addr(op, op1.addr, op2.addr, temp_addr)
        gen_quad_name(op, op1.value, op2.value, temp)
        '''Generates quadruples using temporary addr and name'''
        temp_pos += 1
        return Var(type, temp, temp_addr)
Example #7
0
def p_cte_string(p):
    '''cte_string : CTE_STRING'''
    p[1] = p[1][1:-1]
    addr = symbol_table.insert_cte('string', str(p[1]))
    p[0] = Var('string', str(p[1]), addr)
Example #8
0
def p_cte_bool(p):
    '''cte_bool : CTE_BOOL'''
    addr = symbol_table.insert_cte('bool', bool(p[1]))
    p[0] = Var('bool', bool(p[1]), addr)
Example #9
0
def p_cte_f(p):
    '''cte_f : CTE_F'''
    addr = symbol_table.insert_cte('float', float(p[1]))
    p[0] = Var('float', float(p[1]), addr)
Example #10
0
def p_cte_i(p):
    '''cte_i : CTE_I'''
    addr = symbol_table.insert_cte('int', int(p[1]))
    p[0] = Var('int', int(p[1]), addr)
Example #11
0
def p_unary_not(p):
    '''unary_not : NOT var_cte
                 | NOT paren_exp'''
    p[0] = code_generator.gen_quad_exp('unary!', p[2], Var('', ''))
Example #12
0
def p_unary_minus(p):
    '''unary_minus : MINUS var_cte
                   | MINUS paren_exp'''
    p[0] = code_generator.gen_quad_exp('unary-', p[2], Var('', ''))
Example #13
0
def p_unary_plus(p):
    '''unary_plus : PLUS var_cte
                  | PLUS paren_exp'''
    p[0] = code_generator.gen_quad_exp('unary+', p[2], Var('', ''))