UNIVERSIDAD DEL ISTMO Ingeniería en computación Compiladores PROFESOR M. en C. J. Jesús Arellano Pimentel NÚMERO DE PRÁCTICA 3 NOMBRE DE LA PRÁCTICA Construcción de un sencillo analizador léxico. OBJETIVO GENERAL Construir un sencillo analizador léxico empleando Flex y Microsoft Visual Studio Express 2012 para escritorio. - OBJETIVOS ESPECÍFICOS EQUIPO REQUERIDO SOFTWARE REQUERIDO Crear una especificación Flex para contar los caracteres y líneas de texto en un archivo de texto plano. - 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. Computadora personal con 512 MB de RAM mínimo. - Windows 7/8 - Microsoft Visual Studio Express 2012 para escritorio de 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 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. 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. El comando de compilación puede verse en la Figura 2. 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 2 Figura 1. Carpetas contenidas en el archivo flex-2.5.4a-1-bin.zip. Hecho lo anterior se debe crear una aplicación de consola en el Visual Studio Express 2012 para compilar el código generado por Flex. 2.2 Crear un Proyecto de aplicación de consola Win32 vacío. Paso 1 Iniciar el MVS Express 2012. Paso 2 Crear un nuevo proyecto Win32. Seleccionar la opción del menú Archivo->Nuevo Proyecto. Del cuadro de diálogo Nuevo proyecto en Plantillas seleccionar Visual C++ y Win32; en tipo de aplicación seleccionar Aplicación de consola Win32 Visual C++. El nombre del proyecto o solución podría ser EjeLex1. Presionar el botón Aceptar. Paso 3 Configurar el Proyecto Actual. En el Asistente para aplicaciones Win32 presionar el botón siguiente; después seleccionar la casilla de verificación correspondiente a la opción adicional Proyecto vacío, posteriormente deshabilitar la casilla de verificación de Comprobación del ciclo de vida de desarrollo de seguridad(SDL); finalmente oprimir el botón Finalizar (ver Figura 3). Ingeniería en Computación M. C. J. Jesús Arellano Pimentel 3 Figura 3. Configuración de la aplicación EjeLex1. Paso 4 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 Express 2012. En nuestro caso esta en: \Documents\Visual Studio 2012\Projects\EjeLex1\EjeLex1 Una vez copiado el archivo, en la interfaz del MVC Express 2012 dar clic derecho sobre el elemento Archivos de código fuente del Explorador de soluciones situado a la izquierda, del menú que aparece seleccionar Agregar -> Elemento existente … (ver Figura 4). Cuando aparezca el cuadro de diálogo para seleccionar el archivo se debe elegir a el archivo copiado anteriormente, es decir: EjeLex1.c. Figura 4. Adicionando un archivo de código fuente al proyecto vacío. Paso 5 Compilar y ejecutar Compilar oprimiendo la tecla F7. 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 4 Figura 5. Ejecución de la aplicación EjeLex1.exe. Se puede observar en la Figura 5 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 6). Figura 5. Ejecución de la aplicación EjeLex1.exe con redireccionamiento de la entrada. 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 5