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()