COMPILADOR LEX En este apartado y en el siguiente se describe una herramienta particular, llamada Lex, que ha sido ampliamente usada para especificar analizadores lxicos para una variedad de lenguajes. Se har referencia a la herramienta como el compilador Lex, y a su especificacin de entrada como el lenguaje Lex. !a discusin de una herramienta existente nos permitir mostrar como la especificacin de patrones usando expresiones regulares puede estar combinada con acciones, como por ejemplo, crear entradas en una tabla de s"mbolos, expandir marcos, o incluso generar documentacin automticamente. El programa !ex est dise#ado para ser utilizado junto con el programa Yacc ,es un generador de analizadores sintcticos. !ex suele ser usado seg$n la siguiente figura. Leng y Aut. Beyra Domnguez Ballona %rimero, se prepara una especificacin de un analizador lxico creando un programa contenido, por ejemplo en el fichero prog.l, en lenguaje !ex. Entonces, prog.l se pasa a travs del compilador !ex para producir un programa en &, que por defecto se denomina lex.yy.c en el sistema operativo '()*. +ste consiste en una representacin tabular de un diagrama de transicin construido a partir de las expresiones regulares de prog.l, junto con una rutina estndar que usa la tabla de reconocimiento de lexemas. !as acciones asociadas con expresiones regulares en prog.l son trozos de cdigo &, y son transcritas directamente a lex.yy.c. ,inalmente, lex.yy.c se pasa a travs del compilador & para producir un programa objeto, que por defecto se llama a.out, el cual es el analizador lxico que transforma una entrada en una secuencia de to-ens. 'n programa !ex consta de tres secciones. <declaraciones> // <reglas de traduccin> // <procedimientos auxiliares> !a seccin de declaraciones incluye declaraciones de variables, constantes y definiciones regulares. !as definiciones regulares son sentencias usadas como componentes de las expresiones regulares que aparecen en las reglas. Leng y Aut. Beyra Domnguez Ballona !as reglas de traduccin de un programa !ex son sentencias de la forma. p 0 1 accin 0 2 p 3 1 accin 3 2 ... ... p n 1 accin n 2 donde cada p i es una expresin regular y cada accin i es un fragmento de programa, describiendo qu accin debe realizar el analizador lxico cuando el patrn p i se corresponde con un lexema. En !ex, las acciones estn escritas en &. !a tercera seccin contiene cualesquiera procedimientos auxiliares que sean requeridos por las acciones. 4lternativamente, estos procedimientos pueden ser compilados separadamente y montados junto con el analizador lxico. 'n analizador lxico creado por !ex funciona en concierto con un analizador sintctico de la siguiente manera. &uando es activado por el analizador sintctico, el analizador lxico comienza leyendo de su entrada un carcter a la vez, hasta que encuentre el prefijo ms largo de la entrada que ha correspondido con una de las expresiones regulares p i . Entonces, ejecuta accin i , que t"picamente devolver el control al parser. %ero, si no lo hace, entonces el analizador lxico procede a buscar ms lexemas, hasta que una accin contenga una sentencia return o se lea el fichero completo. !a b$squeda repetida de lexemas hasta una devolucin expl"cita del control permite que el analizador lxico procese los espacios en blanco y comentarios convenientemente. Leng y Aut. Beyra Domnguez Ballona El analizador lxico devuelve un entero, que representa el to-en, al analizador sintctico. %ara pasar un valor de atributo con informacin sobre el lexema, se puede usar una variable global llamada yylval. Esto se hace cuando se use 5acc como generador del analizador sintctico. !os analizadores lxicos, para ciertas construcciones de lenguajes de programacin, necesitan ver adelantadamente ms all del final de un lexema antes de que puedan determinar un to-en con certeza. En !ex, se puede escribir un patrn de la forma r1/r2, donde r1 y r2 son expresiones regulares, que significa que una cadena se corresponde con r1, pero slo si est seguida por una cadena que se corresponde con r2. !a expresin regular r2, despus del operador lookahead 676, indica el contexto derecho para una correspondencia8 se usa $nicamente para restringir una correspondencia, no para ser parte de la correspondencia. Recuperacin de errores lexicogrficos: !os programas pueden contener diversos tipos de errores, que pueden ser. Errores lexicogrficos: 9ue veremos a continuacin. Errores sintcticos: %or ejemplo, una expresin aritmtica con mayor numero de parntesis de apertura que de cierre. Errores semnticos: %or ejemplo, la aplicacin de un operador a un tipo de datos incompatible con el mismo. Errores lgicos: %or ejemplo, un bucle sin final. &uando se detecta un error, un compilador puede detenerse en ese punto e informar al usuario, o bien desechar una serie de caracteres del texto fuente y continuar con el anlisis, dando al Leng y Aut. Beyra Domnguez Ballona final una lista completa de todos los errores detectados. En ciertas ocasiones es incluso posible que el compilador corrija el error, haciendo una interpretacin coherente de los caracteres le"dos. En estos casos, el compilador emite una advertencia, indicando la suposicin que ha tomado, y contin$a el proceso sin afectar a las sucesivas fases de compilacin. !os errores lexicogrficos se producen cuando el analizador no es capaz de generar un to-en tras leer una determinada secuencia de caracteres. En general, puede decirse que los errores lexicogrficos son a los lenguajes de programacin lo que las faltas de ortograf"a a los lenguajes naturales. !as siguientes situaciones producen con frecuencia la aparicin de errores lexicogrficos. 0. !ectura de un carcter que no pertenece al vocabulario terminal previsto para el autmata. !o ms normal en este caso es que el autmata ignore estos caracteres extra#os y continu el proceso normalmente. %or ejemplo, pueden dar error en la fase de anlisis lexicogrfico la inclusin de caracteres de control de la impresora en el programa fuente para facilitar su listado. 2. :misin de un carcter. %or ejemplo, si se ha escrito E!S en lugar de E!SE. 3. Se ha introducido un nuevo carcter. %or ejemplo, si escribimos E!SSE en lugar de E!SE. 4. ;an sido permutados dos caracteres en el to-en analizado. %or ejemplo, si escribiramos ES!E en lugar de E!SE. 5. 'n carcter ha sido cambiado. %or ejemplo, si se escribiera E!<E en vez de E!SE. !as tcnicas de recuperacin de errores lexicogrficos se basan, en general, en la obtencin de los distintos sinnimos de una determinada cadena que hemos detectado como errnea. %or otra parte, el analizador sintctico es capaz en muchos casos de avisar Leng y Aut. Beyra Domnguez Ballona al analizador lexicogrfico de cul es el to-en que espera que ste lea. %ara el ejemplo de borrado de un carcter, tenemos que los sinnimos de E!SE son E!S, E!E, ESE, y !SE. %or tanto, si incluimos en nuestro analizador una rutina de recuperacin de errores debidos a omisin de caracteres, cualquiera de estos sinnimos ser"a aceptado en lugar del lexema E!SE, se emitir"a la correspondiente advertencia, y el proceso continuar"a asumiendo que se ha le"do el to-en =pal>res>E!SE?. 4nlogamente, podemos incluir rutinas para los dems casos. %or ejemplo, si el analizador lee el lexema ES!E, y no puede construir un to-en correcto para l mismo, proceder"a a generar los sinnimos por intercambio de caracteres @es decir, SE!E, E!SE o ESE!A y comprobar"a si alguno de ellos es reconocible. En caso afirmativo, genera el to-en correspondiente y advierte al usuario del posible error y de su interpretacin automtica, continuando con el proceso. Bodos los procedimientos para la recuperacin de errores lexicogrficos son en la prctica mtodos espepc"ficos, y muy dependientes del lenguaje que se pretende compilar.