Está en la página 1de 17

Universidad de Guanajuato

División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Practica #1
Aprende a usar la herramienta Flex/Lex

Integrantes:
Francisco Javier González Ornelas
Jesús Alonso Hernández Santoyo
Joetan Bernardo Arfaxad Saldaña Sánchez
Javier García Cuevas
Eliseo Arturo Navarro Cavazos
Víctor Miguel Santillán Lázaro

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Reporte proyecto #1 “Aprende a usar la herramienta Flex/Lex”

Para ejecutar la herramienta Flex, bastará con escribir en la consola el comando “Flex”, seguido de un
fichero con terminación .l, que contendrá la especificación de nuestro analizador léxico. Flex va a
generar automáticamente código en c correspondiente al analizador léxico. En concreto, este código c
va a tener una función llamada “yylex()”, que será a la que tenemos que llamar para ejecutar el
analizador léxico.

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Después de ejecutar el comando, flex generará un fichero llamado “lex.yy.c”, el cual se tiene que
compilar para posteriormente obtener un archivo ejecutable que servirá para analizar los textos.

Con nuestro archivo ejecutable, usaremos un pipe para enlazarlo con el texto que deseemos analizar.

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Después de la explicación y demostración del funcionamiento de la herramienta Flex, se procedió a


realizar el primer ejercicio propuesto:
%%
%%
int main() {
yylex(); }

Se compila el archivo con la siguiente línea de comando:


Flex ejemplo1.l

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Después se compila el código fuente en C generado para generar el ejecutable del analizador:
gcc -o escaner1 lex.yy.c -lfl

Y finalmente se ejecuta el analizador para procesar algún archivo de texto. Por ejemplo, si el archivo de
texto se llama texto_prueba.txt:
./escaner1 < texto_prueba.txt

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Este texto únicamente incluye la función int main donde se manda llamar yylex(), que se debe declarar
para poder generar el analizador léxico.
Como no contiene definiciones ni reglas, va a copiar el texto de entrada tal cual, a la salida, como se
muestra a continuación:

Continuamos con el segundo ejercicio propuesto:


%{
int num_lines = 0, num_chars = 0;
%}
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
int main() {
yylex();
printf("# of lines = %d, # of chars = %d\n", num_lines, num_chars); }

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Se compilo el archivo ejemplo2.l

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Ahora se compila usando gcc el código fuente en C generado para generar el ejecutable del analizador.

El texto contiene dos definiciones, num_lines y num_chars, ambas inicializadas en 0 y de tipo entero.
Tenemos el patrón \n seguido de la acción ++num_lines y posteriormente ++num_chars, esto indica
que cada que encuentre un salto de línea, aumentara en uno el valor de num_lines y de num_chars. El
segundo patrón que está en el texto es punto sucedido por la acción ++num_chars, que indica que
cuando haya cualquier carácter excepto un avance de línea aumenta en 1 el valor de num_chars.
Entonces usamos el analizador léxico y demostramos:

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Una vez que se ejecutó el analizador de texto, se procedió con el tercer ejercicio propuesto:
%%
[ \t]+ putchar(' ');
[ \t]+$ /* ignore this token */
%%
int main() {
yylex(); }

El programa cambia un espacio o más por solo uno, igualmente para el tabulador

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Continuamos con el cuarto ejercicio propuesto:


%%
"/*" {
register int c;
for (;;) {
while ((c = input()) != '*' && c != EOF);
/* eat up text of comment */
if (c == '*') {
while ((c = input()) == '*');
if (c == '/') break; /* found the end */
}
if (c == EOF) {
error("EOF in comment");
break;
}
}
}
%%
int main() {
yylex();
}

Ahora se compila usando gcc el código fuente en C generado para generar el ejecutable del analizador.

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Se compilo el archivo scanner4.l

Continuamos con el quinto ejercicio propuesto:


%%
^A0 {printf("<table>\n<tr>\n");}
^A[0-9]* {printf("</tr>\n<tr>\n");}
^[B-Z][0-9]* ;
[0-9]* {printf("<td> "); ECHO; printf(" </td>\n");}
[0-9]*"."[0-9]* {printf("<td> "); ECHO; printf(" </td>\n");}
\"[^"]*\" {printf("<td> "); yytext[yyleng-1] = ' '; printf("%s </td>\n",yytext+1);}
= ;
[ \n] ;
. ECHO;

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

%%

main() {
printf("<html>\n");
yylex();
printf("</tr>\n</table>\n</html>\n");
}

Se compilo el archivo scanner5.l

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Ahora se compila usando gcc el código fuente en C generado para generar el ejecutable del analizador.

El texto contiene dos definiciones, num_lines y num_chars, ambas inicializadas en 0 y de tipo entero. Tenemos
el patron \n seguido de la acción ++num_lines y posteriormente ++num_chars, esto indica que cada que
encuentre un salto de línea, aumentara en uno el valor de num_lines y de num_chars. El segundo patron que
esta en el texto es punto sucedido por la acción ++num_chars, que indica que cuando haya cualquier carácter
excepto un avance de línea aumenta en 1 el valor de num_chars. Entonces usamos el analizador léxico y
demostramos:

Una vez generado el ejecutable procedemos a usar el archivo de texto, el cual solo contiene declaraciones:

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Podemos observar que lo que nos muestra en pantalla es similar a código HTML, por que procedemos a
regenerar el un archivo de salida con la extensión .html

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019


Universidad de Guanajuato
División de Ingenierías
Campus Irapuato – Salamanca

Docente: José Ruiz Pinales


Materia: Compiladores

Ahora solo hay que abrir el archivo HTML en el navegador de su preferencia

Salamanca, Guanajuato // jueves, 12 de septiembre de 2019

También podría gustarte