def p_main(p): '''main : MAIN firstmain '(' ')' firstfuncquad block ''' global paramsTemp global actualFunc if func_is_repeated(p[3]): print errors['REPEATED_DECLARATION_FUNC'] exit(1) else: actualFunc=p[1] add_to_func(p[1], 'None', paramsTemp, -1) paramsTemp = []
def p_firstfuncquad(p): '''firstfuncquad : ''' global funcquad funcquad= len(quadruplo) if firstMain!= 1: global paramsTemp global tipoActualReturn global actualFunc #global funcquad if func_is_repeated(p[-4]): print errors['REPEATED_DECLARATION_FUNC'] exit(1) else: actualFunc=p[-4] tipo=tipoActualReturn.pop() add_to_func(p[-4], tipo, paramsTemp,funcquad) paramsTemp = []
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]])