Analizador Lexico en Python

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

Generalidades

Primero que nada, para seguir la tradicion de todos los que escriben este tipo de articulos, ESTA NO PRETENDE SER UNA GUIA DEFINITIVA DE COMO ESCRIBIR ANALIZADORES LEXICOS EN PYTHON. Es mas, este analizador lexico, fue el proyecto que hice para aprender python. Soy novato en python, asi que no esperen encontrar grandes derroches de genialidad en el codigo. Pero funciona :D

Si solo les interesa el codigo fuente, lo pueden encontrar AQUI

Esta es la primera de 5 partes en el camino al disenio de compiladores. Un compilador es una compleja pieza de software, compuesta de 5 partes: Lexico, Sintaxis, Semantica, VCI y Ejecucion. Cada una de estas partes es necesaria para la siguiente, asi que nos vamos a ir en orden, primero lo primero.
Un compilador funciona (masomenos) de la siguiente forma: recibe el codigo fuente, obtiene la lista de tokens (en un momento vamos con eso), valida que esten sintactica y semanticamente correctos y genera un vector de codigo intermedio que sera utilizado en la ejecucion.

Ahora si, que son los tokens??? los tokens son todos los elementos de nuestro codigo fuente, los cuales tienen valor y significado por si mismos; por ejemplo, las cadenas, los identificadores, las constantes, etc etc etc. Primero hay que definir un lexico, que es la guia para identificar tokens. En este caso, nuestro lexico tiene las siguientes consideraciones:

Palabras reservadas

program function var
clear gotoxy say
repeat until while
do if then
else case store
to call and
or not get

Identificadores Enteros
Los identificadores enteros comienzan con el caracter ‘&’ seguido de 7 o menos caracteres alfabeticos.
Identificadores Flotantes
Los identificadores floantes comienzan con el caracter ‘%’ seguido de 7 o menos caracteres alfabeticos.
Identificadores String
Los identificadores string comienzan con el caracter ‘$’ seguido de 7 o menos caracteres alfabeticos.
Identificadores de funciones
Los identificadores de funciones comienzan con el caracter ‘@’ seguido de 7 o menos caracteres alfabeticos.
Constantes enteras
Las constantes enteras pueden o no llevar signo (positivo o negativo) seguido unicamente de digitos. Los enteros deben de estar en el rango de -32767 a 32768. Si no estan dentro de ese rango, automaticamente se convierten en flotantes
Constantes flotantes
Las constantes flotantes pueden o no llevar signo (positivo o negativo), seguido de cero o mas digitos, un punto decimal, y por lo menos 1 digito despues del punto decimal. No se permiten numeros con notacion exponencial.
Constantes string
Las constantes string comienzan y terminan con comillas dobles. El uso de comillas dobles dentro de la cadena esta permitido, siempre que antes se encuentre el backslash. No se permite un string en varias lineas. Ejemplo: “Rodrigo \”nibblesmx\” Garcia”
Comentarios
Los comentarios deben estar delimitados a la izquierda por los caracteres slash seguido de un asterisco. A la derecha deben estar delimitados por los caracteres asterisco, seguido de un slash. No se permite un comentario en varias lineas. Ejemplo: /* esto es un comentario */
Operadores aritmeticos

++ - - ** + - * /

Operadores logicos

= <> < <= > >=

Caracteres que generan tokens

; ( ) , [ ] { } .

Caracteres que NO generan tokens

  • Espacios en blanco
  • Tabulaciones
  • Fin de la linea
  • Fin de archivo
  • Comillas (solo se aceptan si van dentro del string y estan precedidas por un backslash)

Basta de generalidades. Ahora pasamos a la estructura del compilador. Es importante saber algo de programacion orientada a objetos y conocimiento basico de XML