Analizador Lexico en Python

Generalidades | Estructura del compilador | Reconocimiento de tokens | Tabla de tokens

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 :D

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