Anda di halaman 1dari 3

A nlisis lxico

En este captulo le mostraremos cmo construir un analizador lxico. Para implementar


unanalizador lxico a mano, es til empezar con un diagrama o cualquier otra descripcin
de los lexemas de cada token. De esta manera, podemos escribir cdigo para identificar
cada ocurrencia de cada lexerna en la entrada, y devolver informacin acerca del token
identificado.
Podemos producir tambin un analizador lxico en forma automtica, especificando los
patrones de los lexemas a mi generador de analizadores lxicos, y compilando esos
patrones en cdigo que funcione como un analizador lxico. Este mtodo facilita la
modificacin de un analizador lxico, ya que slo tenemos que reescribir los patrones
afectados, y no todo el programa.
Como la primera fase de un compilador, la principal tarca del analizador lxico es leer
los caracteres de la entrada del programa fuente, agruparlos en lexemas y producir como
salida una secuencia de tokens para cada lexerna en el programa fuente. El flujo de tokens
se enva al ana-lizador sintctico para su anlisis. Con frecuencia el analizador lxico
interacta tambin con la tabla de smbolos.
Como el analizador lxico es la parte del compilador que lee el texto de origen, debe
realizar otras tareas aparte de identificar lexemas. Una de esas tarcas es eliminar los
comentarios y el espacio en blanco (caracteres de espacio, nueva lnea, tabulador y tal vez
otros caracteres que se utilicen para separar tokens en la entrada). Otra de las tareas es
correlacionar los mensajes de error generados por el compilador con el programa fuente.
Por ejemplo, el analizador lxico puede llevar el registro del nmero de caracteres de
nueva lnea vistos, para poder asociar un nmero de lnea con cada mensaje de error. En
algunos compiladores, el analizador lxico crea una copia del programa fuente con los
mensajes de error insertados en las posiciones apro-piadas. Si el programa fuente utiliza
un preprocesador de macros, la expansin de las macros tambin pueden formar parte de
las tareas del analizador lxico.
Existen varias razones por las cuales la parte correspondiente al anlisis de un compilador
se separa en fases de anlisis lxico y anlisis sintctico (parsing).
1. La sencillez en el diseo es la consideracin ms importante. La separacin del anlisis
lxico y el anlisis sintctico a menudo nos permite simplificar por lo menos una de estas
tareas. Por ejemplo, un analizador sintctico que tuviera que manejar los comentarios y
el espacio en blanco como unidades sintcticas sera mucho ms complejo que uno que
asumiera que el analizador lxico ya ha eliminado los comentarios y el espacio en blanco.
Si vamos a disear un nuevo lenguaje, la separacin de las cuestiones lxicas y sintcticas
puede llevar a un diseo ms limpio del lenguaje en general.
2. Se mejora la eficiencia del compilador. Un analizador lxico separado nos permite
aplicar tcnicas especializadas que sirven slo para la tarea lxica, no para el trabajo del
anlisis sintctico. Adems, las tcnicas de bfer especializadas para leer caracteres de
entradapueden agilizar la velocidad del compilador en forma considerable.
Se mejora la portabilidad del compilador. Las peculiaridades especficas de los
dispositivos de entrada pueden restringirse al analizador lxico. Un token es un par que
consiste en un nombre de token y un valor de atributo opcional. El nombre del token es
un smbolo abstracto que representa un tipo de unidad lxica: por ejemplo, una palabra
clave especfica o una secuencia de caracteres de entrada que denotan un identificador.
Los nombres de los tokens son los smbolos de entrada que procesa el analizador
sintctico. A partir de este momento, en general escribiremos el nombre de un token en
negrita. Con frecuencia nos referiremos a un token por su nombre.
Un patrn es una descripcin de la forma que pueden tomar los lexemas de un token. En
el caso de una palabra clave como token, el patrn es slo la secuencia de caracteres que
forman la palabra clave. Para los identificadores y algunos otros tokens, el patrn es una
estructura ms compleja que se relaciona mediante muchas cadenas.
Cuando ms de un lexema puede coincidir con un patrn, el analizador lxico debe
proporcionar a las subsiguientes fases del compilador informacin adicional sobre el
lexema especfico que coincidi. Por ejemplo, el patrn para el token numero coincide
con 0 y con 1, pero es en extremo importante para el generador de cdigo saber qu
lexema se encontr en el programa fuente. Por ende, en muchos casos el analizador lxico
devuelve al analizador sintctico no slo el nombre de un token, sino un valor de atributo
que describe al lexema que representa ese token; el nombre del token influye en las
decisiones del anlisis sintctico, mientras que el valor del atributo influye en la
traduccin de los tokens despus del anlisis sintctico. Vamos a suponer que los tokens
tienen cuando menos mi atributo asociado, aunque este atributo tal vez tenga una
estructura que combine varias piezas de informacin. El ejemplo ms importante es el
token id. en donde debemos asociar con el token una gran cantidad de informacin. Por
lo general, la informacin sobre un identificador (por ejemplo, su lexema, su tipo y la
ubicacin en la que se encontr por primera vez, en caso de que haya que emitir un
mensaje de error sobre ese identificador) se mantiene en la tabla de smbolos. Por lo tanto,
el valor de atributo apropiado para un identificador es un apuntador a la entrada en la
tabla de smbolos para ese identificador.
Si utilizamos el esquema de la seccin 3.2.1 en la forma descrita, debemos verificar, cada
vez que movemos el apuntador avance, que no nos hayamos salido de uno de los bferes;
si esto pasa, entonces tambin debemos recargar el otro bfer. As, por cada lectura de
caracteres hacemos dos pruebas: una para el final del bfer y la otra para determinar qu
carcter se lee (esta ltima puede ser una bifurcacin de varias vas). Podemos combinar
la prueba del final del bfer con la prueba del carecer actual si extendemos cada bfer
para que contenga un valor centinela al final. El centinela es un carcter especial que no
puede formar parte del programa fuente, para lo cual una opcin natural es el carcter eof.
La figura 3.4 muestra el mismo arreglo que la figura 3.3, pero con los centinelas
agregados. Observe que eof retiene su uso como marcador del final de toda la entrada.
Cualquier of que aparezca en otra ubicacin distinta al final de un bfer significa que
llegamos al final de la entrada. La figura 3.5 sintetiza el algoritmo para mover avance
hacia delante. Observe cmo la primera prueba, que puede formar parte de una
bifurcacin de varias vas con base en el carcter al que apunta avance, es la nica pmeba
que hacemos, excepto en el caso.
Desde que Klccnc introdujo las expresiones regulares con los operadores bsicos para la
unin, la concatenacin y la cerradura de Klcene en la dcada de 1950, se han agregado
muchas extensiones a las expresiones regulares para mejorar su habilidad al especificar
los patrones de cadenas. Aqu mencionamos algunas extensiones rotacionales que se
incorporaron por primera vez en las herramientas de Unix como Lex, que son muy tiles
en la especificacin de los analizadores lxicos. Las referencias a este captulo contienen
una explicacin de algunas variantes de expresiones regulares en uso hoy en da.
Como paso intermedio en la construccin de mi analizador lxico, primero convertimos
los patrones en diagramas de flujo estilizados, a los cuales se les llama diagramas de
transicin de estados". En esta seccin, realizaremos la conversin de los patrones de
expresiones regulares a los diagramas de transicin de estados en forma manual, pero en
la seccin 3.0 veremos que hay una forma mecnica de construir estos diagramas, a partir
de colecciones de expresiones regulares.
Los diagramas de transicin de estados tienen una coleccin de nodos o crculos, llama-
dos estados. Cada estado representa una condicin que podra ocurrir durante el proceso
de explorar la entrada, buscando mi lexema que coincida con uno de varios patrones.
Podemos considerar un estado como un resumen de todo lo que debemos saber acerca de
los caracteresque hemos visto entre el apuntador mido Lexema y el apuntador .
Las lneas se dirigen de un estado a otro del diagrama de transicin de estados. Cada lnea
se etiqueta mediante mi smbolo o conjunto de smbolos. Si nos encontramos en cierto
estados, y el siguiente smbolo de entrada es a, buscamos una lnea que salga del estado
s y est etiquetado por a (y tal vez por otros smbolos tambin). Si encontramos dicha
lnea, avanza-mos el apuntador avance y entramos al estado del diagrama de transicin
de estados al que nos lleva esa lnea. Asumiremos que todos nuestros diagramas de
transicin de estados son deterministas. lo que significa que nunca hay ms de una lnea
que sale de un estado dado, con un smbolo dado de entre sus etiquetas. A partir de la
seccin 3.5. relajaremos la condicin del determinismo, facilitando en forma considerable
la vida del diseador de un analizador lxico,aunque esto se har ms difcil para el
implementador.

Anda mungkin juga menyukai