Está en la página 1de 8

UNIVERSIDAD DEL ISTMO

Ingeniería en computación
Compiladores

PROFESOR M. en C. J. Jesús Arellano Pimentel


ALUMNO Emanuel Marcial Castillo

NÚMERO DE PRÁCTICA 3

NOMBRE DE LA PRÁCTICA Construcción de un sencillo analizador léxico.

Construir un sencillo analizador léxico empleando Flex y Microsoft


OBJETIVO GENERAL
Visual Studio Community 2017 para escritorio.
-Crear una especificación Flex para contar los caracteres y
líneas de texto en un archivo de texto plano.
OBJETIVOS ESPECÍFICOS - Instalar el Flex para compilar la especificación.
- Compilar en el Visual Studio el código generado por Flex
para así obtener finalmente un sencillo analizador léxico.
EQUIPO REQUERIDO Computadora personal con 2 GB de RAM mínimo (4 recomendado).
- Windows 7/8/10
- Microsoft Visual Studio Community 2017 para escritorio de
SOFTWARE REQUERIDO
Windows
- Flex

1.- Fundamentos.

1.1.- Flex

Flex es un una herramienta que permite generar analizadores léxicos. A partir de un conjunto
de expresiones regulares, Flex busca concordancias en un fichero de entrada y ejecuta
acciones asociadas a estas expresiones. Es compatible casi al 100% con Lex, una herramienta
clásica de Unix para la generación de analizadores léxicos, pero es un desarrollo diferente
realizado por GNU bajo licencia GPL.

2.- Desarrollo

2.1 Instalar el Flex.

Paso 1 Descargar e instalar una versión de Flex para Windows.


La versión a utilizar en esta práctica es la 2.5.4a. se puede encontrar en Internet
buscando el archivo flex-2.5.4a-1-bin.zip. La instalación consiste simplemente en
descomprimir el archivo .zip, con ello se generará el sistema de archivos de la Figura 1.
En dicha figura se puede observar una carpeta con el nombre de bin, en ésta carpeta
quedará el ejecutable del Flex.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


1
Figura 1. Carpetas contenidas en el archivo flex-2.5.4a-1-bin.zip.

Paso 2 Crear la especificación Flex.


La especificación Flex debe permitir contar cada uno de los caracteres y líneas que
conformen cualquier archivo de texto plano, dicha especificación es la siguiente:

%{
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int num_lin = 0, num_car = 0;


%}
%%
[\n] num_lin++;
. num_car++;
%%

int yywrap()
{
return 1;
}

int main()
{
yylex();
printf("Numero de lineas %d\n",num_lin);
printf("Numero de caracteres %d\n",num_car);
return 0;
}

Utilizando la aplicación de Notepad de Windows editamos la especificación anterior.


Es importante que al guardarla seleccionemos en Tipo de documento “Todos los
archivos”, en lugar de “Documentos de texto *.txt”, de esta forma es posible guardar el
archivo con extensión .l (punto ele). Se sugiere que el nombre del archivo sea
EjeLex1.l y que se guarde en la misma ruta donde se tiene el archivo flex.exe en la
carpeta bin.

Paso 3 Compilar la especificación guardada en el archivo EjeLex1.l con flex.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


2
Para compilar la especificación .l se debe abrir la consola de comandos y cambiarse a
la ruta donde previamente se descomprimió el archivo Flex.exe, que es el mismo lugar
donde debe encontrarse el archivo EjeLex1.l.

Esto se hace con el comando cd + ruta del archivo,


o bien,
(cd C:\Users\EmanueL\Documents\UNISTMO\QUINTO SEMESTRE\Compiladores\Unidad 2\flex\bin) ,
para hacer esto de una forma más práctica, se abre la carpeta bin y se presiona
simultáneamente la tecla “shift” + “click derecho”, y posteriormente se da click en
“Abrir ventana de comandos aquí” (figura 2), esto último sólo funciona en las
versiones de Windows anteriores al Windows 10, ya que fue eliminado en la última
actualización. Para que funcione en Windows 10, se puede instalar un software llamado
“Winaero”, que se puede encontrar en la red buscando el archivo
“winaerotweaker.zip”, pero eso es algo que no será abarcado en este artículo.

Figura 2. Abrir ventana de comandos.

Una vez que se tiene la ventana de comandos posicionada en la ruta de la carpeta bin,
ejecutamos el siguiente comando: “flex.exe –oEjeLex1.c EjeLex1.1” (Figura 3). La
opción -o indica el nombre del archivo fuente a generar, en nuestro caso el archivo se
llamará EjeLex1.c.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


3
Figura 3. Creación del archivo “EjeLex1.c” desde la ventana de comandos.

Hecho lo anterior se debe crear una aplicación de consola en el Visual Studio


Community 2017 para compilar el código generado por Flex.

2.2 Crear un Proyecto de aplicación de consola de Windows vacío.

Paso 1 Iniciar el MVS Community 2017.

Paso 2 Crear un nuevo proyecto de aplicación de consola.


Es posible crear proyectos utilizando diferentes elementos que ofrece la interfaz. El
más simple es hacer clic sobre el texto que dice Nuevo Proyecto de la página principal
ubicada en el centro, o bien mediante el menú Archivo->Nuevo Proyecto.
Del cuadro de dialogo Nuevo proyecto en Instalado, seleccionar Visual C++, y dentro
de éste, seleccionar Proyecto Vacío (ver Figura 4). El nombre del proyecto o solución
podría ser EjeLex1 Presionar el botón Aceptar.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


4
Figura 4. Configuración de la aplicación EjeLex1.

Paso 3 Adicionar al proyecto vacío el archivo generado por Flex.


Copiar el archivo generado por Flex a la ruta del proyecto generado por el MVS
Community 2017. En nuestro caso esta en:
C:\Users\EmanueL\Documents\UNISTMO\QUINTO
SEMESTRE\Compiladores\ejemplos\LEX\EjeLex1\EjeLex1

Una vez copiado el archivo, en la interfaz del MVC Community 2017, dar clic derecho
sobre el elemento Archivos de código fuente, del Explorador de soluciones situado a la
derecha, del menú que aparece seleccionar Agregar -> Elemento existente … (ver
Figura 5). Cuando aparezca el cuadro de diálogo para seleccionar el archivo se debe
elegir el archivo copiado anteriormente, es decir: EjeLex1.c.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


5
Figura 5. Adicionando un archivo de código fuente al proyecto vacío.

Paso 5 Compilar y ejecutar


Compilar oprimiendo las teclas Ctrl+Mayús+B.

Es posible que al compilar la solución aparezca el siguiente error:


Grav Estado
Código Descripción Proyecto Archivo Línea
edad suprimido
'fileno': The
POSIX name for
this item is
deprecated.
Instead, use the C:\Users\EmanueL\Documents\UNISTMO\QUINTO
Error C4996 EjeLex1 1211
ISO C and C++ SEMESTRE\Compiladores\ejemplos\LEX\EjeLex1\EjeLex1\EjeLex1.c
conformant
name: _fileno.
See online help
for details.

Para solucionarlo, basta con ir a la línea 1211 del archivo “EjeLex1.c” y agregar un “_”
(guion bajo) antes de la llamada a la función “fileno”, quedando esta línea de la
siguiente forma:

b->yy_is_interactive = file ? (isatty( _fileno(file) ) > 0) : 0;

El resultado de la compilación puede producir algunas advertencias, sin embargo se


debe generar un ejecutable en la carpeta Debug de la solución. Lo anterior es posible
verificarlo en el sistema de archivos.
La ejecución se puede realizar de dos formas desde la consola de comandos de
Windows. La primera es simplemente ejecutando el archivo .exe generado tal como se
muestra en la Figura 5.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


6
Figura 6. Ejecución de la aplicación EjeLex1.exe.

Se puede observar en la Figura 6 que se tecleó un conjunto de 4 palabras en tres líneas,


pero en la última línea se oprimieron simultáneamente las teclas ctrl y z, lo que da
como resultado la visualización de ^Z, esto se utiliza para indicar el fin del flujo de
caracteres de entrada o el final del archivo de entrada.
La segunda forma de ejecución consiste en “pasarle” desde la línea de comandos el
archivo que el sencillo analizador léxico debe inspeccionar, esto se logra mediante la
ejecución, desde la consola de Windows, del archivo EjeLex1.exe con
redireccionamiento de la entrada (ver Figura 7).

Figura 7. Ejecución de la aplicación EjeLex1.exe con redireccionamiento de la entrada.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


7
Observe que en la ejecución se empleó un archivo localizado en la misma ruta que el
ejecutable y además se utilizó el carácter < de la siguiente forma:

EjeLex1.exe < EjeLex1.ilk

Abriendo el archivo EjeLex1.ilk es posible comprobar que efectivamente cuenta con el


número de caracteres y líneas producidas como salida del análisis léxico.

Ingeniería en Computación M. C. J. Jesús Arellano Pimentel / Emanuel Marcial Castillo


8

También podría gustarte