def p_generaGOSUB(p): '''generaGOSUB : ''' global listaCuadruplos global llamada global diccionarioVarGlobal global listaFunciones print "Se guardo GOSUB", llamada pos = busquedaFunc(llamada) aux1 = listaFunciones[pos].cuadruploInicial cuadr = Cuadruplo(32,-1,-1,aux1) listaCuadruplos.append(cuadr) var = diccionarioMemoria['3'] mem = var[str(listaFunciones[pos].tipo)] pos2 = diccionarioVarGlobal[llamada] cuadr = Cuadruplo(5,pos2,-1,mem) diccionarioMemoria['3'][listaFunciones[pos].tipo] = mem + 1 listaCuadruplos.append(cuadr) pass
def p_finPilaSaltosWhile(p): '''finPilaSaltosWhile : ''' global pilaSaltos global listaCuadruplos saltos = pilaSaltos.pop() saltos2 = pilaSaltos.pop() cuadr = Cuadruplo(17,-1,-1,saltos2) listaCuadruplos.append(cuadr) lenCuadruplos = len(listaCuadruplos) listaCuadruplos[saltos].temporal = lenCuadruplos print "Se guardo GOTO RETORNO: ", cuadr.operador, cuadr.temporal pass
def p_checarImpresion(p): ''' checarImpresion : ''' global pilaOperadores global pilaOperandos global listaCuadruplos signo = pilaOperadores.pop() if signo == 18: operando1C = pilaOperandos.pop() memoria = pilaOperandosDirMem.pop() cuadr = Cuadruplo(signo, memoria,-1,-1) listaCuadruplos.append(cuadr) print "SE GUARDO EL CUADRUPLO DE LECTURA" pass
def p_checarMover(p): ''' checarMover : ''' global pilaOperadores global pilaOperandos global listaCuadruplos signo = pilaOperadores.pop() if signo == 24: pilaOperandos.pop() cant = pilaOperandosDirMem.pop() dirc = pilaOperandos.pop() cuadr = Cuadruplo(signo, 1, dirc, cant) listaCuadruplos.append(cuadr) print "SE GUARDO EL CUADRUPLO DE DIBUJAR"
def p_checarElse(p): '''checarElse : ELSE ''' print "Entre a checar else" global pilaSaltos global listaCuadruplos #meter cuadruplo de go to a la pila cuadr = Cuadruplo(17,-1,-1,0) listaCuadruplos.append(cuadr) #rellena el goto falso lenCuadruplos = len(listaCuadruplos) salto = pilaSaltos.pop() listaCuadruplos[salto].temporal = lenCuadruplos pilaSaltos.append(lenCuadruplos - 1) pass
def p_generarEra(p): ''' generarERA : fondoFalso ''' global listaCuadruplos global listaFunciones global contParam global llamada contParam = 0 pos = busquedaLista() arrParametros = listaFunciones[pos].arrParam longitud = len (arrParametros) r = diccionarioVarGlobal[llamada] cuadr = Cuadruplo(30, -1, -1,r ) listaCuadruplos.append(cuadr) print "Se guardo ERA ", llamada pass
def p_checarDibujar(p): ''' checarDibujar : ''' global pilaOperadores global pilaOperandos global listaCuadruplos signo = pilaOperadores.pop() if signo == 19: col = pilaOperandos.pop() posy = pilaOperandosDirMem.pop() posx = pilaOperandosDirMem.pop() ids = pilaOperandosDirMem.pop() cuadr = Cuadruplo(signo,ids,(posx,posy),col) listaCuadruplos.append(cuadr) pilaOperandos.pop() pilaOperandos.pop() print "SE GUARDO EL CUADRUPLO DE DIBUJAR"
def p_checarContenido(p): ''' checarContenido : ''' global pilaSaltos global listaCuadruplos global pilaOperandos aux = pilaOperandos.pop() if aux != 8: print "Error en while" sys.exit() else: resultado = aux temp = pilaOperandosDirMem.pop() #GOTO FALSO RESULTADO _____ cuadr = Cuadruplo(16,temp, -1,0) listaCuadruplos.append(cuadr) pilaSaltos.append(len(listaCuadruplos) - 1) print "Se guardo GOTO FALSO WHILE: ", cuadr.operador, cuadr.temporal pass
def p_generarCuadRetorno(p): ''' generarCuadRetorno : ''' global listaCuadruplos global diccionarioVarGlobal global pilaOperadores global pilaOperandosDirMem global funcionActual global listaFunciones global pilaOperandos posicion = busquedaLista() posicion2 = busquedaVar(p[-1]) if posicion2 != -1: memoria = listaFunciones[posicion].arrVar[posicion2] pilaOperandos.append(memoria.tipo) pilaOperandosDirMem.append(memoria.direcmem) if funcionActual != 'inicio': aux = pilaOperandosDirMem.pop() cuadr = Cuadruplo(29, -1, aux, diccionarioVarGlobal[funcionActual]) listaCuadruplos.append(cuadr) pilaOperandos.pop()
def p_checarOperadorIgual(p): '''checarOperadorIgual : ''' global pilaOperadores global listaCuadruplos global pilaOperandos signo = pilaOperadores.pop() if(signo == 5): operando2 = pilaOperandos.pop() operando1 = pilaOperandos.pop() resultado = cuboSemantico[operando1][operando2][signo] if(resultado == -1): print "Error con signo = " sys.exit() else: print("SE CHECO EL CUADRUPLO ASIGNACION Y ES CORRECTO ", operando1, operando2, signo) operando2C = pilaOperandosDirMem.pop() operando1C = pilaOperandosDirMem.pop() cuadr = Cuadruplo(signo, operando2C, -1, operando1C) listaCuadruplos.append(cuadr) pass
def p_checaoperador6(p): '''checaoperador6 : ''' global pilaOperadores global pilaOperandos global diccionarioMemoria global pilaOperandosDirMem opr = len(pilaOperadores) print "Entra checaroperador 6" print ("PilaOperadores: ", pilaOperadores) if(opr != 0): if((pilaOperadores[opr-1] == 6) | (pilaOperadores[opr-1] == 7) | (pilaOperadores[opr-1] == 8) | (pilaOperadores[opr-1] == 9) | (pilaOperadores[opr-1] == 10) | (pilaOperadores[opr-1] == 11) | (pilaOperadores[opr-1] == 12) | (pilaOperadores[opr-1] == 13) ): operando2 = pilaOperandos.pop() operando1 = pilaOperandos.pop() operadorActual = pilaOperadores.pop() resultado = cuboSemantico[operando1][operando2][operadorActual] posicion = busquedaLista() var = diccionarioMemoria['3'] print("Resultado: ", resultado) #meter a pila el temporal if resultado == -1: print "ERROR: Operacion invalida, tipos no compatibles" sys.exit() else: print("SE CHECO EL CUADRUPLO Y ES CORRECTO", operando2, operando1, operadorActual) valormem = var[str(resultado)] agregarVar = TVar('temp', resultado, valormem,0,0) diccionarioMemoria['3'][str(resultado)] = valormem + 1 listaFunciones[posicion].arrVar.append(agregarVar) pilaOperandosDirMem.append(valormem) resultadoT = pilaOperandosDirMem.pop() operando2C = pilaOperandosDirMem.pop() operando1C = pilaOperandosDirMem.pop() cuadr = Cuadruplo(operadorActual, operando1C,operando2C,resultadoT) listaCuadruplos.append(cuadr) pilaOperandos.append(resultado) pilaOperandosDirMem.append(resultadoT) print "asdasd ", pilaOperandos, " ", resultadoT pass
def p_verificarTiposFunc(p): ''' verificarTiposFunc : ''' global pilaOperandos global pilaOperandosDirMem global listaFunciones global contParam global listaCuadruplos global arrParametros global llamada pos = busquedaFunc(llamada) arrParametros = listaFunciones[pos].arrParam auxParam = arrParametros[contParam].tipo auxPila = pilaOperandos.pop() mem = pilaOperandosDirMem.pop() if(auxParam != auxPila): print "TIPO DE PARAMETRO INCORRECTO" sys.exit() else: aux = arrParametros[contParam].direcmem cuadr = Cuadruplo(31, -1, mem,aux) listaCuadruplos.append(cuadr) pass
def p_checarIF(p): '''checarIF : ''' print "Entre a checar IF" global pilaOperandos global pilaSaltos global pilaOperadores global pilaOperandosDirMem aux = pilaOperandos.pop() if aux != 8: print "Error semantico en condicion IF" sys.exit() else: lenCuadruplos = len(listaCuadruplos) pilaSaltos.append(lenCuadruplos) print pilaOperandos temporal = pilaOperandosDirMem.pop() cuadr = Cuadruplo(16,temporal,-1,0) print "Guarde cuadruplo IF" listaCuadruplos.append(cuadr) print pilaOperandos print pilaOperadores pass
def p_generaCuadruploMatriz(p): ''' generaCuadruploMatriz : "]" ''' global listaCuadruplos global listaFunciones global pilaOperadores global pilaOperandosDirMem global colArreglo global idActual pilaOperadores.pop() print "Entre generaCuadruploMatriz", pilaOperandosDirMem pos = busquedaLista() func = listaFunciones[pos].arrVar longi = len(func) if colArreglo != 0: #genera cuadruplos para matrices pilaOperadores.pop() operando1 = pilaOperandos.pop() operandoMem1 = pilaOperandosDirMem.pop() operando2 = pilaOperandos.pop() operandoMem2 = pilaOperandosDirMem.pop() #cuadruplo verificar cuadr = Cuadruplo(33,operandoMem2, 0, renArreglo) print "renArreglo ", renArreglo listaCuadruplos.append(cuadr) #direccion base para cuadruplos if busquedaVar(idActual) != -1: aux = busquedaVar(idActual) elif busquedaVarGlobal(idActual) != -1: aux = busquedaVarGlobal(idActual) elif busquedaVarParam(idActual) != -1: aux = busquedaVarGlobal(idActual) else: print "No se encontro la variable dimensionada" sys.exit() dirBase = func[aux].direcmem var = diccionarioMemoria['3'] mem = var[str(operando1)] cuadr = Cuadruplo(3, operandoMem2, operandoMem1, mem) listaCuadruplos.append(cuadr) cuadr2 = Cuadruplo(33,operandoMem1, 0, colArreglo) listaCuadruplos.append(cuadr2) cuadr1 = Cuadruplo(1, mem, operandoMem1, mem+1) diccionarioMemoria['3'][listaFunciones[pos].tipo] = mem + 2 listaCuadruplos.append(cuadr1) print "colArreglo = ", colArreglo var1 = diccionarioMemoria['3'] mem1 = var['9'] cuadr = Cuadruplo(1, mem+1,dirBase, mem1) listaCuadruplos.append(cuadr) pilaOperandosDirMem.append(mem1) pilaOperandos.append(operando1) diccionarioMemoria['3']['9'] = mem1 + 1 else: #genera cuadruplos para los arreglos operando1 = pilaOperandos.pop() operandoMem1 = pilaOperandosDirMem.pop() print "renArreglo = ", renArreglo, pilaOperandosDirMem cuadr = Cuadruplo(33,operandoMem1, 0, renArreglo) listaCuadruplos.append(cuadr) if busquedaVar(idActual) != -1: aux = busquedaVar(idActual) elif busquedaVarGlobal(idActual) != -1: aux = busquedaVarGlobal(idActual) elif busquedaVarParam(idActual) != -1: aux = busquedaVarGlobal(idActual) else: print "No se encontro la variable dimensionada" sys.exit() dirBase = func[aux].direcmem var = diccionarioMemoria['3'] mem = var['9'] cuadr = Cuadruplo(1, operandoMem1,dirBase, mem) listaCuadruplos.append(cuadr) pilaOperandosDirMem.append(mem) pilaOperandos.append(operando1) diccionarioMemoria['3']['9'] = mem + 1 pass
diccConstantes = {} diccionarioVarGlobal = {} pilaOperandosDirMem = [] pilaSaltos = [] pilaSaltosFunc = [] operadorActual = 0 contParam = 0 llamada = "" resultado = -1 colArreglo = 0 renArreglo = 0 renglon = 0 columna = 0 DEBUG = True idActual = "" cuadr = Cuadruplo(17, -1, -1, -1) listaCuadruplos.append(cuadr) # BNF #Sintaxis que inicia el programa def p_programa(p): '''programa : vars funcion INICIO funcAgregarInicio bloque FIN liberarVar | vars funcion INICIO FIN ''' print("SE TERMINO EL PROGRAMA CON EXITO!") escribeArchivo() pass #Regla para guardar en diccionario de funciones la funcion de inicio def p_funcAgregarInicio(p): '''funcAgregarInicio : ''' global funcionActual global listaFunciones
from TablaDirecciones import TablaDirecciones from TablaConstantes import TablaConstantes import sys tipoFuncionLeido = "" tipoVarLeido = "" nombreFuncion = "" nombreVar = "" listaVariables = [] directorioFunc = DirFunciones() cuboSem = CuboSemantico() pilaPoper = [] pilaOp = [] pilaTipos = [] pilaSaltos = [] cuadruplos = Cuadruplo() dicDirecciones = { "globalInt" : TablaDirecciones(1000, 3999), "globalFloat" : TablaDirecciones(4000, 6999), "globalChar" : TablaDirecciones(7000, 9999), "localInt": TablaDirecciones(10000, 12999), "localFloat": TablaDirecciones(13000, 15999), "localChar": TablaDirecciones(16000, 18999), "tempInt": TablaDirecciones(19000, 21999), "tempFloat": TablaDirecciones(22000, 24999), "tempChar": TablaDirecciones(25000, 27999), "tempBool": TablaDirecciones(28000, 30999), "constInt": TablaDirecciones(31000, 33999), "constFloat": TablaDirecciones(34000, 36999), "constChar": TablaDirecciones(37000, 39999), "constString": TablaDirecciones(40000, 42999)
listaFunc.append(objeto) linea = archivo.readline() linea = archivo.readline() #crea el diccionario de constantes con la direccion de memoria y el valo correspondiente. while linea != '$$\n': lineaAux = linea.split(' ') diccionarioConstantes[lineaAux[0]] = lineaAux[1] linea = archivo.readline() linea = archivo.readline() #crea la lista de cuadruplos con los cruaduplos encontrados en el archivo de texto. while linea != '$$\n': lineaAux = linea.split(' ') if(len(lineaAux)) == 4: cuadr = Cuadruplo(lineaAux[0], lineaAux[1], lineaAux[2],lineaAux[3]) elif (len(lineaAux)) == 5: cuadr = Cuadruplo(lineaAux[0], lineaAux[1], lineaAux[2]+lineaAux[3], lineaAux[4]) listaCuadruplos.append(cuadr) linea = archivo.readline() archivo.close() #Crea la memoria del main y la mete a la lista de memorias memoriaMain = Memoria(0,{},{},{},{},{},{},{},{},{},{},{},{}, {},{},{},{},{}) listaMemoria.append(memoriaMain) #Comienza a leer los cuadruplos while contCuadruplos < len(listaCuadruplos): options[listaCuadruplos[contCuadruplos].operador](listaCuadruplos[contCuadruplos].operando1, listaCuadruplos[contCuadruplos].operando2, listaCuadruplos[contCuadruplos].temporal) exitonclick()