Analizador Lexico en Python
Tabla de tokens
La tabla de tokens es una estuctura de datos en la cual podemos encontrar todos los tokens que se generan a partir de nuestro codigo fuente (si es que estos son correctos). La tabla de tokens tiene la siguiente estructura:
- Token
- Este es el token que acabamos de reconocer. Justo como aparece en nuestro codigo fuente
- Codigo del token
- Este es el valor que va a tener nuestro token, segun se lo definimos en nuestro XML. Este numero generalmente es negativo, por motivos que se mencionaran en la parte de Sintaxis.
- Tabla de simbolos
- Una valor booleano (False/True o 0/1) que indica si el token en cuestion sera escrito en la tabla de simbolos que se genera en sintaxis. Es positivo en caso de que el token sea una constante, o un identificador de cualquier tipo
- Numero de linea
- Numero de lina donde fue encontrado el token
Como vimos en el apartado anterior, una vez que reconocimos un token valido, e hicimos validaciones extras sobre el mismo, mandamos llamar a la funcion tablaTokens de la siguiente forma:
self.tablaTokens(code, token, i)
en donde code es el grupo al que pertenece nuestro token, token es el token valido que fue reconocido, e i es el numero de linea donde se encontro este token.
Ahora veremos el codigo del metodo tablaTokens
def tablaTokens(self, codigo, token, linea):
tbl_simbolos = 0
if codigo in ["INT", "STRING", "FLOAT", "ID_INT", "ID_FLOAT", "ID_FUNC", "ID_STRING"]: tbl_simbolos = 1
if codigo == "RESRVD": codigo = self.tokens.getCodigo(codigo, token)
else: codigo = self.tokens.getCodigo(codigo)
self.tbl_tokens.append([token, codigo, tbl_simbolos, linea+1])
En donde primero definimos una bandera falsa, para el campo tabla de simbolos. Despues verificamos que el grupo del token, pertenece a algun identificador o constante. En caso afirmativo, la bandera pasa a positiva. Despues, obtenemos el codigo del token a partir del XML, y a partir de estos datos, genera una lista, la cual es agregada a la lista tbl_tokens de nuestra clase de lexico.
Ademas de la lista de tokens en memoria, necesitamos escribir la tabla de tokens en un archivo fisico en la computadora. Para eso utilizamos el metodo escribirTabla de nuestra clase Lexico
def escribirTabla(self):
archivo = open("./shared/tokens.tbl", "w")
for token in self.tbl_tokens:
archivo.write(repr(token) + '\n')
archivo.close()
Que simplemente recorre nuestra lista en memoria, y la vacia a un archivo que se escribe en el directorio “shared” bajo el nombre de “tokens.tbl”. En la practica, para las siguientes partes del compilador, utilizaremos la tabla que tenemos en memoria, pues es mas facil de recorrer y acceder a una posicion especifica. El archivo que contiene la tabla, es para fines de consulta, debugueo, y porque el profesor nos la pidio
Estos son todos los pasos que hay que seguir para construir un analizador lexico en python sencillo. Espero que les sirva de algo y que puedan utilizarlo en sus proyectos, y como siempre, si tienen alguna sugerencia, correccion o cualquier comentario sobre el mismo, pueden contactarme en nibblesmx@gmail.com
Suerte y hasta luego