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())
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)
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
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
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)
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)
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)
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)
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)
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)
def p_unary_not(p): '''unary_not : NOT var_cte | NOT paren_exp''' p[0] = code_generator.gen_quad_exp('unary!', p[2], Var('', ''))
def p_unary_minus(p): '''unary_minus : MINUS var_cte | MINUS paren_exp''' p[0] = code_generator.gen_quad_exp('unary-', p[2], Var('', ''))
def p_unary_plus(p): '''unary_plus : PLUS var_cte | PLUS paren_exp''' p[0] = code_generator.gen_quad_exp('unary+', p[2], Var('', ''))