Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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>
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
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.
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]+
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); }