def p_idp(p): '''idp : '[' sexp ']' | '(' idpp ')' | empty''' global pilao global funcParams elmt= p[1] if elmt == '[': aux=pilao.pop() if(aux[1] != 'int'): #validar si la superexp es id para marcar error print errors['TYPE_MISMATCH'] exit(-1) res1=validate_arr(p[-1]) #por ser sexp se hace pop quadruplo.append(['ver', aux[0],0,int(res1[2])-1]) res =mem_temps.add_type('int',1) quadruplo.append(['+', aux[0],res1[0],res]) pilao.append([[res], res1[1]]) # el quadruplo cuando es arreglo lo ponemos diferente para identificar que hay que checar onruntime elif elmt == '(': if func_is_repeated(p[-1]): tempparams=[] for x in range(0,funcParams): tempparams.append(pilao.pop()) if validate_func_params(p[-1],deepcopy(tempparams)): quadruplo.append(['era', get_func_vars(p[-1]),p[-1],'-1']) for x in tempparams: quadruplo.append(['param',x[0],'-1', funcParams ]) funcParams= funcParams-1 quadruplo.append(['gosub', get_func_quad(p[-1]),p[-1],'-1']) if get_func_return_type(p[-1]) != 'void': res =mem_temps.add_type(get_func_return_type(p[-1]),1) quadruplo.append(['=', p[-1],'-1',res]) pilao.append([res, get_func_return_type(p[-1]) ]) pp.pprint(pilao) pp.pprint(constant_dict) else: print errors['PARAMS_FUNC_BADQUANT'] exit(-1) else: print errors['NOT_DECLARED_FUNCTION'] exit(-1) else: res=get_var(p[-1]) pilao.append([res[0], res[1]])
def p_ret(p): '''ret : RETURN sexp ';' ''' global ret ret=pilao.pop() tipo=get_func_return_type(actualFunc) if ret and (tipo != 'void') and (ret[1]==tipo): quadruplo.append(['return',actualFunc,'-1',ret[0]]) quadruplo.append(['retorno','-1','-1','-1']) elif tipo != 'void' or ret: print errors['RETURN_TYPE_FUNC_MISSMATCH'] exit(-1)
def p_firstfuncquad2(p): '''firstfuncquad2 : ''' tipo=get_func_return_type(actualFunc) if not ret and tipo!='void': print errors['RETURN_TYPE_FUNC_MISSMATCH'] exit(-1) if not ret and tipo=='void': quadruplo.append(['retorno','-1','-1','-1']) if ret: if (ret[1]!=tipo) and tipo!='void': print errors['RETURN_TYPE_FUNC_MISSMATCH'] exit(-1) global mem_local mem_local= MapaMemoria(0, 1000, 2000, 3000,4000)# borrar mem_local para empezar global mem_temps mem_temps=MapaMemoria(12000,13000,14000,15000,16000)# borrar mem_local delete_local_var_dict()