Está en la página 1de 6

Leng y Aut.

Beyra Domnguez Ballona


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.

También podría gustarte