Está en la página 1de 6

INSTITUTO TECNOLOGICO SUPERIOR DE TANTOYUCA

Analizador Lxico
ALUMNOS: MIGUEL ANGEL RAMOS CRUZ FRANCISCO JAVIER REYES DE LA CRUZ EDGAR EUSEBIO MARTINEZ ANTONIO GRUPO: S/5-1 DOCENTE: LLUVIA ERENDIRA PONCE MARTNEZ

Generador de Analizadores Lxicos Lex


Una vez visto cmo las expresiones regulares pueden ser muy tiles a la hora de reconocer patrones en un fichero de texto, y de utilizarlas para desencadenar ciertas acciones en respuesta, vamos a estudiar una herramienta que permite crear programas autnomos que analizan lxicamente la entrada y la procesan a nuestro antojo: el generador de analizadores lxicos lex. Lex genera cdigo fuente en C, a partir de una serie de especificaciones escritas en lenguaje Lex. El cdigo C generado contiene una funcin llamada yylex(), que localiza cadenas en la entrada (lexemas) que se ajusten a uno de los patrones lxicos especificados en el cdigo fuente Lex, realizando entonces las acciones asociadas a dicho patrn. yylex() puede llevar a cabo cualquier tipo de acciones ante un determinado patrn y, en particular, puede comportarse como un analizador lxico. Funcionamiento de lex Al contrario que sed y awk, lex no es un analizador sino un generador de analizadores. Esto permite incluir de manera cmoda un analizador a medida en cualquier programa: Programa Compilador de Lex Fuente en lex.yy.c (lex, flex) Lex (.l) Compilador de C gcc l gcc -lfl

lex.yy.c

a.out

Fichero De entrada

a.out

Acciones

El lenguaje Lex Un programa fuente de Lex tiene el siguiente aspecto: <seccin de definiciones>
%%

<seccin de reglas>
%%

<seccin de rutinas>

De estas tres secciones, slo la segunda es obligatoria, y cualquiera de

ellas puede estar vaca. Esto quiere decir que el mnimo programa en lex es: %%
La seccin de declaraciones incluye declaraciones de variables,

constantes y definiciones regulares, que constituyen una manera cmoda de utilizar expresiones regulares largas en la seccin de reglas; por ejemplo: Letra [A-Za-z]
La seccin de reglas especifica los patrones a reconocer y las acciones

asociadas a stos, de forma similar a la que utiliza awk: Patrn {acciones en C}


La seccin de rutinas permite definir funciones auxiliares en C, incluida

la funcin main(). Por defecto, lex proporciona un main() que simplemente llama a la funcin yylex().

El comportamiento del programa generado (por defecto a.out, si no se le indica otra cosa al compilador de C) es el siguiente:
Imprimir en la salida estndar los lexemas que no se adapten a ningn

patrn.
Realizar la accin indicada para los lexemas que se ajustan a un patrn.

Por lo tanto, si compilamos y ejecutamos el programa mnimo en lex, que consta nicamente de una seccin de reglas vaca (%%), veremos que se limita a copiar Literalmente la entrada estndar en la salida estndar. Seccin de reglas A primera vista, una regla de lex tiene el mismo aspecto que una sentencia patrnaccin de awk. Su estructura es: patrn_regular accin_en_C El patrn regular debe estar situado en la primera posicin de la lnea; es decir, que no puede haber espacios antes del patrn regular. Lex admite todas las expresiones regulares de egrep, con alguna extensin ms. El patrn y la accin se separan por un blanco o un tabulador (o ms).

La accin puede ser una sola sentencia de C, o una sentencia compuesta, encerrada entre llaves {}. Cuando hay ms de un patrn regular que puede adaptarse a la entrada, lex tomar la cadena ms larga posible que pueda adaptarse a un patrn. Si an as hay ms de un patrn que se adapta a la entrada, lex ejecutar la accin de la regla que antes aparezca en el fuente lex. Lex almacena el lexema encontrado en un array de tipo char llamado yytext, y su longitud en la variable yyleng. La accin especial ECHO copia el lexema reconocido en la salida estndar. Es un sinnimo de printf("%s",yytext); La accin especial | (barra vertical) indica que para este patrn debe ejecutarse la accin correspondiente al patrn inmediatamente inferior. Todo programa lex incorpora automticamente la siguiente lnea como ltima regla .|\n ECHO; equivalente a estas dos reglas separadas: .| \n ECHO;

De manera que todos los lexemas que no encajan con ningn otro patrn, se copian en la salida estndar. Se puede evitar este comportamiento especificando reglas para . y para \n. Cdigo C en un programa lex Muchas veces es til poder incluir cdigo en C dentro de un programa en lex, para apoyar el trabajo del analizador. Suele ser normal, por ejemplo, declarar una estructura de datos que contenga detalles sobre cada lexema encontrado o incluir nuestra propia funcin main(). Puede insertarse cdigo C en una fuente Lex en varias partes:
En la seccin de declaraciones, entre una lnea %{ y una lnea %} (ntese

que no es }%). Este cdigo ser externo y se situar antes de la funcin yylex() en el programa lex.yy.c.

En la seccin de declaraciones, cualquier lnea que comience por un

espacio en blanco se considerar cdigo C y ser tambin externo y anterior a yylex().


En la seccin de reglas, y antes de que empiece la primera regla, toda lnea

que comience por un espacio en blanco se considerar cdigo C que ser interno a la funcin yylex(). Normalmente no es necesario incluir cdigo C de esta manera.
En la seccin de reglas, las acciones en C de cada regla sern parte del cdigo de yylex(). Toda la seccin de rutinas es cdigo C, externo y posterior a la funcin
yylex().

Puede utilizarse para cualquier cosa, pero en particular, puede usarse para definir una funcin main() distinta a la que se genera por defecto. Ejemplos: Sustituir las palabras el y la, los y las por la palabra ARTICULO. %% el|la|los|las printf ("ARTICULO"); %% el | la | los | las printf ("ARTICULO"); Lo mismo, pero sin afectar a palabras como lanza: %% [Ee]l [Ll][oa]s? [A-Za-z]+

| printf ("articulo"); ECHO;

Pasar a maysculas los artculos determinados: %% [Ee]l [Ll][ao]s?

| { int i; for (i=0;i<yyleng;i++) printf ("%c",toupper(yytext[i])); }

Contar el nmero de artculos determinados: %{ /* Cuenta el nmero de artculos determinados */ int num=0; %} %% [Ee]l | [Ll][oa]s? num++ ; [A-Za-z]+ ; .|\n ; %% main(){ yylex(); printf ("Nmero de artculos: %d\n", num); }

También podría gustarte