def p_idCallaux4(p):
    '''
    idCallaux4 : 
    '''
    condicion = table.dirFuncs[table.programa].searchIfExists(p[-7])
    if(condicion == False):
        limInf = table.dictCte[0]
        limSup = table.dictCte[table.dirFuncs[table.auxFunc].dir_var[p[-7]].dim[0]]
        dirBase = table.dirFuncs[table.auxFunc].dir_var[p[-7]].dir
    else:
        limInf = table.dictCte[0]
        limSup = table.dictCte[table.dirFuncs[table.programa].dir_var[p[-7]].dim[0]]
        dirBase = table.dirFuncs[table.programa].dir_var[p[-7]].dir
    resultExp = cuad.PilaO.pop()
    result_type = cuad.Ptypes.pop()
    #resultExp = cuad.PilaO[-1]
    #result_type = cuad.Ptypes[-1]
    if result_type == 'int':
        acceso = table.accessPointer + mem.basePointer
        table.accessPointer = table.accessPointer +1
        cuad.quadInsert("VER", resultExp, limInf, limSup)
        cuad.contQuad = cuad.contQuad + 1
        desplazamiento = resultExp
        pointerBase = table.dictCte.get(dirBase)
        cuad.quadInsert('+t',desplazamiento, pointerBase, acceso)
        cuad.contQuad = cuad.contQuad + 1

        cuad.PilaO.pop()
        cuad.Ptypes.pop()

        cuad.pushPilaO(acceso)
        cuad.pushType(result_type)
    else:
        print("ERROR : No se puede accesar a un arreglo/Matriz en indice diferente a integer")
        sys.exit()
def p_initProg(p):
    '''
    initProg : 
    '''
    table.ingresarTabla(p[-1], None)
    table.programa = p[-1]
    table.auxFunc = p[-1]
    cuad.quadInsert('Goto', None, None, None)
    cuad.contQuad = cuad.contQuad+1
    table.addCte(0)
def p_verExist(p):
    '''
    verExist :
    '''
    exist = table.dirFuncs.get(p[-1], False)
    if(exist == False):
        print("ERROR : la funcion \"", p[-1] ,"\" no esta previamente declarada")
        sys.exit()
    
    cuad.quadInsert('ERA', None, None, p[-1])
    cuad.contQuad = cuad.contQuad + 1
    cuad.paramK = 1
    cuad.pointerParam = p[-1]
def p_idCallaux2(p):
    '''
    idCallaux2 : 
    '''
    condicion = table.dirFuncs[table.programa].searchIfExists(p[-5])
    if(condicion == False):
        limInf = table.dictCte[0]
        limSup = table.dictCte[table.dirFuncs[table.auxFunc].dir_var[p[-5]].dim[0]]
    else:
        limInf = table.dictCte[0]
        limSup = table.dictCte[table.dirFuncs[table.programa].dir_var[p[-5]].dim[0]]
    resultExp = cuad.PilaO[-1]
    cuad.quadInsert("VER", resultExp, limInf, limSup)
    cuad.contQuad = cuad.contQuad + 1
def p_endF(p):
    '''
    endF :
    '''
    #Borrar Tabla de Variables Locales
    table.dirFuncs[table.auxFunc].dir_var.clear()

    #Insertar cuadruplo de fin de funcion
    cuad.quadInsert('ENDFunc', None, None, None)
    cuad.contQuad = cuad.contQuad + 1
    #Agrega a el tamaño de la funcion, los espacios necesarios de int, float, char y boolean temporales necesarios
    table.ingresaERAifcLocalTemporal()

    #table.dirFuncs[table.auxFunc].printSize()
    #Reinicio contadores
    table.clearVarSize()
def p_paramType(p):
    '''
    paramType :
    '''
    arg = cuad.PilaO.pop()
    arg_type = cuad.Ptypes.pop()
    params = table.dirFuncs[cuad.pointerParam].params
    tam = len(params)
    if(cuad.paramK > tam):
        print("ERROR: mas parametros de los esperados")
        sys.exit()
    tipo = table.dirFuncs[cuad.pointerParam].params[cuad.paramK-1]
    #num = "Par"+str(cuad.paramK)
    num = cuad.paramK
    if(arg_type == tipo):
        cuad.quadInsert('PARAM', arg, None , num)
        cuad.contQuad = cuad.contQuad + 1
    else:
        print("ERROR: type mismatch de parametros en llamada", cuad.pointerParam)
        sys.exit()
def p_coherenceGo(p):
    '''
    coherenceGo :
    '''
    params = table.dirFuncs[cuad.pointerParam].params
    tam = len(params)
    if(cuad.paramK < tam):
        print("ERROR: faltaron parametros")
        sys.exit()
    cuad.quadInsert('GOSUB', None, None , cuad.pointerParam)
    cuad.contQuad = cuad.contQuad + 1
    #Parche Guadalupano
    tipoRet = table.dirFuncs[cuad.pointerParam].type
    if(tipoRet != 'void'):
        Guadalupano = cuad.getAvail(tipoRet)
        table.contadorERAlocalTemporal(tipoRet)
        func = table.dirFuncs[table.programa].dir_var.get(cuad.pointerParam)
        funcDir= func.dir
        cuad.quadInsert('=', funcDir, None , Guadalupano)
        cuad.pushPilaO(Guadalupano)
        cuad.pushType(tipoRet)
        cuad.contQuad = cuad.contQuad + 1
def p_endProg(p):
    '''
    endProg : 
    '''
    temp = table.dirFuncs[table.auxFunc].dir_var
    for id in temp:
        var = temp.get(id)
        tipo = var.getType()
        table.contadorERAlocal(tipo)

    #Agrega a el tamaño de la funcion, los espacios necesarios de int, float y char locales necesarios
    table.ingresaERAifcLocal()
    #Agrega a el tamaño de la funcion, los espacios necesarios de int, float, char y boolean temporales necesarios
    table.ingresaERAifcLocalTemporal()
    #Borrar Tabla de Variables Locales
    table.dirFuncs[table.auxFunc].dir_var.clear()

    #Insertar cuadruplo de fin de funcion
    cuad.quadInsert('ENDProgram', None, None, None)
    cuad.contQuad = cuad.contQuad + 1
    
    #Reinicio contadores
    table.clearVarSize()
def p_idCallaux3(p):
    '''
    idCallaux3 : 
    '''
    condicion = table.dirFuncs[table.programa].searchIfExists(p[-10])
    if(condicion == False):
        limInf = table.dictCte[0]
        limSup = table.dictCte[table.dirFuncs[table.auxFunc].dir_var[p[-10]].dim[1]]
        dim1 = table.dictCte[table.dirFuncs[table.auxFunc].dir_var[p[-10]].dim[0]]
        dirBase = table.dirFuncs[table.auxFunc].dir_var[p[-10]].dir
    else:
        limInf = table.dictCte[0]
        limSup = table.dictCte[table.dirFuncs[table.programa].dir_var[p[-10]].dim[1]]
        dim1 = table.dictCte[table.dirFuncs[table.programa].dir_var[p[-10]].dim[0]]
        dirBase = table.dirFuncs[table.programa].dir_var[p[-10]].dir
    resultExp2 = cuad.PilaO.pop()
    result_type2 = cuad.Ptypes.pop()
    resultExp1 = cuad.PilaO.pop()
    result_type = cuad.Ptypes.pop()
    if (result_type2 == 'int' and result_type == 'int'):
        acceso = table.accessPointer + mem.basePointer
        table.accessPointer = table.accessPointer +1
        cuad.quadInsert("VER", resultExp2, limInf, limSup)
        cuad.contQuad = cuad.contQuad + 1
        #desplazamiento = resultExp2*dim1+resultExp1
        temp = cuad.getAvail('int')
        table.contadorERAlocalTemporal('int')
        cuad.quadInsert('*',resultExp2, dim1, temp)
        cuad.contQuad = cuad.contQuad + 1
        temp2 = cuad.getAvail('int')
        table.contadorERAlocalTemporal('int')
        cuad.quadInsert('+',temp, resultExp1, temp2)
        cuad.contQuad = cuad.contQuad + 1
        pointerBase = table.dictCte.get(dirBase)
        cuad.quadInsert('+t',temp2, pointerBase, acceso)
        cuad.contQuad = cuad.contQuad + 1

        cuad.PilaO.pop()
        cuad.Ptypes.pop()

        cuad.pushPilaO(acceso)
        cuad.pushType(result_type)

    else:
        print("ERROR : No se puede accesar a un arreglo/Matriz en indice diferente a integer")
        sys.exit()