Professional Documents
Culture Documents
ANLISIS LXICO
Contenido
FUNCIONES DEL ANALIZADOR LXICO .................................................................................. 3 VENTAJAS DE SEPARAR EL ANLISIS LXICO..................................................................... 4 COMPONENTES LXICOS, PATRONES, LEXEMAS .............................................................. 4 ESPECIFICACIN DE LOS COMPONENTES LXICOS: EXPRESIONES REGULARES 5 RECONOCIMIENTO DE LOS COMPONENTES LXICOS: AUTMATAS FINITOS.......... 6 Componente lxico: ..................................................................................................................... 6 Autmatas finitos determinsticos .............................................................................................. 6 IMPLEMENTACIN DE UN ANALIZADOR LXICO. ................................................................ 7 Mediante bucles anidados .......................................................................................................... 7 Mediante una tabla de transiciones ........................................................................................... 8 ASPECTOS PRCTICOS PARA LA IMPLEMENTACIN DE UN ANLISIS LXICO........ 9 Principio de Mxima longitud ...................................................................................................... 9 Palabras reservadas versus identificadores ............................................................................ 9 Gestin de buffer de Entrada.................................................................................................... 10 Aspectos a tener en cuenta de la implementacin ............................................................... 10 TRATAMIENTO DE ERRORES LXICOS ................................................................................ 11 GENERADORES AUTOMTICOS DE ANALIZADORES LXICOS .................................... 12
ANLISIS LXICO
Segn (Louden, 2004, pg. 31): La fase de rastreo, o anlisis lxico, de un compilador tiene la tarea de leer el programa fuente como un archivo de caracteres y dividirlo en tokens. Los tokens son como las palabras de un lenguaje natural: cada token es una secuencia de caracteres que representa una unidad de informacin en el programa fuente. En resumen el analizador lxico se encarga del reconocimiento de tokens que pasa al analizador sintctico adems se interrelacionan con una tabla de smbolos que el analizador lxico elabora al reconocer identificadores, palabras clave que ingresan a esta tabla para un reconocimiento lxico adecuado.
Dentro de otras funciones secundarias del analizador lxico se encuentran:: El manejo del fichero de entrada del programa fuente: abrirlo, leer sus caracteres, cerrarlo y gestionar posibles errores de lectura. Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea del cdigo fuente debido a que estos caracteres no son vlidos para la elaboracin de tokens. Inclusin de cheros: #include. La expansin de macros y funciones in-line: #dene. Contabilizar el nmero de lneas y columnas para emitir mensajes de error. Reconocimiento y ejecucin de las directivas de compilacin (por ejemplo, para depurar u optimizar el cdigo fuente).
typedef enum{ TKN IF, TKN THEN, TKN NUM, TKN ID, TKN OPADD,...} TokenType;
Los componentes lxicos se representan mediante una estructura registro con tipo de token y lexema: typedef struct { TokenType token; char *lexema; //se reserva memoria dinmicamente } TokenRecord; TokenRecord getToken(void); a[indice]= 2 + 4
Cada componente lxico va acompaado de su lexema: <TKN <TKN <TKN <TKN <TKN <TKN <TKN ID, a> CORAPER, [> ID, indice> CORCIERRE, ]> NUM, 2> OPADD, +> NUM, 4>
Concatenacin, repeticin (*) y alternativas (|) vamos a usar los siguientes metasmbolos: Una o ms repeticiones + r+ indica una o ms repeticiones de r (0|1)+ = (0|1)(0|1)*
Cualquier carcter. .*b.* indica cualquier cadena que contiene una letra b
Un rango de caracteres [ ] (clase) [a-z] indica cualquier carcter entre la a y z minsculas [a-z A-Z] indica cualquier letra del abecedario minscula o mayscula [0-9] indica cualquier dgito de 0 a 9 [abc] indica a|b|c. Cualquier carcter excepto un conjunto dado (a|b) indica cualquier carcter que no sea una a o b. Ejemplos:
nat = [0-9]+ signedNat = ( + | -)? nat number = signedNat(.nat)? (E signedNat)? Identicadores letter = [a-zA-Z] digit = [0-9] identifier = letter (letter | digit)* Palabras Reservadas tkn if = if tkn while = while tkn do = do
Un analizador lxico es responsable de: Manejo de apertura y cierre de archivo, lectura de caracteres y gestin de posibles errores de apertura. Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea. Inclusin de archivos y macros. Contabilizar nmero de lneas y columnas para emitir mensajes de error.
ch=next input char; stete = 1; while (state == 1 o 2) do case state 1: case ch letter : avanzar en la entrada ; state=2; otro caso : state = error u otro fin_case; 2: case ch letter , digit : avanzar en la entrada; state =2 (no necesario); otro caso : state =3;
El cdigo que se genera es largo y difcil de mantener en el caso de que introduzcan nuevos caracteres en el alfabeto de entrada o nuevos estados.
Se asume que los campos en blanco son errores. Los estados de aceptacin se marca con una columna adicional. Los corchetes representan que no se tiene que consumir un carcter en la entrada (no avanzar).;
state =1; ch = next_input_character; while (not accept [state]) and (not error(state)) do newstate = T[state,ch]; if advance[state,ch] then ch=next_input_char; state=newstate; end while; if accept[state] then accept; Advance y Accept son dos arrays booleanos indexados por el estado y por el carcter en la entrada. El primero indica si tenemos que avanzar en la entrada. El segundo si tenemos un estado de aceptacin Ventajas: el cdigo es reducido y fcil de mantener, sirve para cualquier analizador, las modificaciones se realizan solo en la tabla. Desventaja: tablas de gran tamao, se incrementa el espacio necesario (velocidad algo reducida respecto al mtodo anterior). Este mtodo es el que utiliza Flex (Linux) y Lex (Unix). Coste: O(|x|) , es independiente del tamao del autmata.
Otra forma es la de crear diagramas de transicin de estados separados para cada palabra reservada, donde se va a identificar si la palabra reservada termina el recorrido y as considerarlo como token y no como un ID.
Almacenara en variables el nmero de lnea y columna para emitir mensajes de error. Las palabras reservadas se reconocen como identificadores y antes de devolver un identificador se comprueba si es una palabra reservada o un identificador consultando en una tabla previamente inicializada con las palabras reservadas Hay casos en los que es necesario reinsertar un carcter en el buffer de entrada Adems de los componentes lxicos definidos por el lenguaje es conveniente aadir un par especiales para indicar el final de fichero y la deteccin de un error.
Los errores lxicos se deben a descuidos del programador. En general, la recuperacin de errores lxicos es sencilla y siempre se traduce en la generacin de un error de sintaxis que ser detectado ms tarde por el analizador sintctico, cuando el analizador lxico devuelve un componente lrico que el analizador sintctico no espera en esa posicin. Los mtodos de recuperacin de errores lxicos se basan bien en saltarse caracteres en la entrada hasta que un patrn se ha podido reconocer; o bien usar otros mtodos mas sofisticados que incluyen la insercin borrado, sustitucin de un carcter en la entrada o intercambio de dos caracteres consecutivos. Una buena estrategia para la recuperacin de errores lxicos: Si en el momento de detectar el error ya hemos pasado por algn estado final ejecutamos la accin correspondiente al ltimo estado final visitado con el lexema formado hasta que salimos de l; el resto de caracteres ledos se devuelven al flujo de entrada y se devuelven al estado inicial; Si no hemos pasado ningn estado final, advertimos que el carcter encontrado no se esperaba, lo eliminamos y proseguimos con el anlisis.
Si se sabe que el siguiente componente lxico es una palabra reservada, es posible corregir la palabra mal escrita, por ejemplo si se ha escrito hwile en vez de while o fi en vez de if intercambiamos caracteres adyacentes.
C } C } C } C } }
La seccin de definiciones incluye declaraciones de variables, constantes y definiciones regulares que pudieran ser utilizadas ms adelante. La seccin de reglas describe cada patrn y cada accionen un fragmento de cdigo que indica la accin que se debe realizar cuando se encuentra dicho patrn. La seccin de cdigo auxiliar contiene las funciones que pueden ser llamadas por las acciones de la seccin reglas. Algunas consideraciones: Cualquier cdigo C que se desea insertar va comprendido entre %{ y %}. FLEX hace correspondencia siempre con la cadena ms larga.
Si se verifican dos patrones, se elige la regla que aparece primero (colocar las palabras reservadas antes que los identificadores). Para definir las expresiones regulares se utiliza los smbolos:
Uso Definir clase Definir Rangos Carcter de Escape para representar simb. Especiales Negacin Representar una cadena de caracteres Operadores habituales para expresiones regulares Opcionalidad Expansin macro definida en seccin primera Ejemplo [a-z] [a-z] \t [^xy] while [0-9]+ [0-9]+(.[0-9]+)? { digit }
Smbolo [] \ ^ * + ( ) | ? { }
char * yytext; int yyleng; int yylong; int yylex; FILE * yyin; FILE * yyout; char input(); void output(c); void unput(c); yywrap();
Bibliografa
Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2008). Anlisis lxico. En A. V. Aho, M. S. Lam, R. Sethi, & J. D. Ullman, Compiladores, Principios, Tecnicas y Herramientas (pgs. 109-190). Mxico: Prentice Hall. Louden, K. C. (2004). Rastreo o anlisis lxico. En K. C. Louden, Contruccion de Compiladores (pgs. 31-94). Mxico: Ediciones Paraninfo, S.A.