Exemplo n.º 1
0
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]])
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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()