def CrearTablaSimbolos(ListaIdentificadores,tipoRobot,instrucciones): ''' * Descripción de la función: Dada una lista de identificadores y un tipo crea una tabla de símbolos y a su vez va chequeando si existe una redeclaración. * Variables de entrada: - ListaIdentificadores: Lista enlazada de identificadores. - tipoRobot: Tipo de los valores que almacenarán los identificadores. * Variables de salida: - Ninguno. ''' global Ultimo aux = ListaIdentificadores Tabla = TablaSimbolos(Ultimo) Tabla.instrucciones = instrucciones Ultimo = Tabla while (aux != None) : redeclaracion, tablaEncontrada = Tabla.buscar(aux.value) if (redeclaracion != None): print("Error en la línea",aux.numeroLinea, ": Redeclaración de la variable","\'"+str(aux.value)+"\'.") sys.exit() else: Tabla.insertar(aux.value,tipoRobot,"robot") aux = aux.sig # Se inserta 'me' en la tabla: Tabla.insertar("me",tipoRobot)
def VerificarInstruccionesListaDeclaraciones(ArbolInstrucciones,tipoRobot): ''' * Descripción de la función: Esta funcion dado un arbol de instrucciones,un tipo y una tabla de simbolos verifica la correctitud semantica de las instrucciones de la lista de declaraciones del lenguaje BOT. * Variables de entrada: - ArbolInstrucciones: Lista enlazada de instrucciones. - tipoRobot: Tipo de variables (tipo del robot). * Variables de salida: - ListaTablas: Arreglo de tabla de simbolos. ''' ListaTablas = [] aux = ArbolInstrucciones while (aux!=None): instrucciones = aux.instrucciones TablaLocal = TablaSimbolos() TablaLocal.insertar("me",tipoRobot) while (instrucciones!=None): # Se verifican las expresiones de las instrucciones STORE,DROP, # RIGHT, LEFT, UP y DOWN if (instrucciones.type in {"STORE","DROP","right","left","up","down"}): Tipo = VerificarExpresionBinaria(instrucciones.expresiones, TablaLocal) if (instrucciones.type in {"right","left","up","down"}): if (Tipo!=None): VerificarTipoVariable(Tipo,"int", instrucciones.numeroLinea) # El tipo de expresion de la instruccion STORE debe ser # igual al tipo del robot. elif (instrucciones.type == "STORE"): VerificarTipoVariable(Tipo,tipoRobot, instrucciones.numeroLinea) # Se verifican los identificadores de las instrucciones COLLECT # y READ. elif (instrucciones.type in {"COLLECT","READ"}): identificador = instrucciones.identificador if (identificador!=None): resultado = TablaLocal.buscarLocal(identificador.value) if(resultado!=None): print("Error en linea", identificador.numeroLinea ,": La variable \'"+ str(identificador.value)+"\' ha sido redeclarada.") sys.exit() else: # Se almacenan las nuevas variables a la tabla. TablaLocal.insertar(identificador.value, tipoRobot,aux.condicion.type) instrucciones = instrucciones.sig ListaTablas += [TablaLocal] aux = aux.sig