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_asignp(p): '''asignp : '=' sexp ';' | '[' sexp ']' '=' sexp ';' ''' if p[1] == '[': aux1=pilao.pop() # por la forma de la sintaxis este es el valor a igualar 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) if str(res1[0]) not in constant_dict: constant_dict[str(res1[0])] = mem_constants.add_type('int',1) quadruplo.append(['+', aux[0],constant_dict[str(res1[0])],res]) quadruplo.append(['=', aux1[0], '-1', res]) pp.pprint(constant_dict) else: pp.pprint(pilao) quadruplo.append(['=', pilao.pop()[0], '-1', pilao.pop()[0] ])