jueves, 3 de diciembre de 2009

Cómo configurar Flex en Windows

¿A cuántos de nosotros, durante nuestras carreras en la Universidad, nos han pedido como proyecto hacer un analizador léxico, hacer un compilador o cosas afines?, ¿A cuántos de nosotros se nos pasó el tiempo, y sobre la hora queremos desarrollar estos proyectos desde cero? ¿A cuántos de nosotros nos fascinaría estructurar nuestro propio lenguaje o quizás desarrollar nuestro propio compilador? ... Pues en este post les presentó la herramienta básica de quien se aventura (y también para quién solo está de pasada) en este maravilloso mundo de los compiladores y otros programas que no son exactamente compiladores, pero que presentan algunas características de estos como los coloreadores de código.
Flex es una herramienta para generar escáneres, es decir programas que reconocen patrones léxicos en un texto. En otras palabras, flex se encarga de convertir esos patrones léxicos en tokens que pueden servir para estructurar una gramática (en el caso de un compilador) o para colorear código (En caso de un coloreador de código).
A continuación mostraré un ejemplo de script para flex:

%{
#include <stdio.h>
#include <conio.h>
int num_lineas = 0, num_caracteres = 0;
%}
%option noyywrap
%option yylineno
letra [a-zA-Z]
digito [0-9]
binario [0-1]
ignora " "|\t|\n
operarit *|+|-|/
operlog &|$
comparador <|>|<=|>=|==|!=
%%
{ignora}+                   {;}
{letra}({letra}|{digito})*  {printf("IDENTIFICADOR\n");}
{letra}+                    {printf("CADENA\n");}
{binario}+                  {printf("BOOLEANO\n");} 
{digito}+                   {printf("ENTERO\n");}
{digito}+"."{digito}+       {printf("REAL\n");}
{comparador}                {printf("COMPARADOR\n");}
":="                        {printf("ASIGNADOR\n");}
";"                         {printf("PUNTO_COMA\n");}
"!="                        {printf("DIFERENCIA\n");}
","                         {printf("COMA\n");}
"=="                        {printf("IGUAL\n");}
"."                         {printf("PUNTO\n");}
">="                     {printf("MAYOR_IGUAL\n");}
"<="                     {printf("MENOR_IGUAL\n");}
"("                         {printf("OPEN_PARENTESIS\n");}
")"                         {printf("CLOSE_PARENTESIS\n");}
">"                      {printf("MAYOR\n");}
"<"                      {printf("MENOR\n");}
"{"                         {printf("OPEN_LLAVE\n");}
"}"                         {printf("CLOASE_LLAVE\n");}
"+"                         {printf("SUMA\n");}
"-"                         {printf("RESTA\n");}
"*"                         {printf("MUTIPLICACION\n");}
"/"                         {printf("DIVISION\n");}
"&"                         {printf("AND\n");}
"$"                         {printf("OR\n");}
\n                          ++num_lineas;
.                           {printf("ERROR LEXICO EN LINEA %d \n",yylineno);}
%%
int main(int argc,char *argv[])
{
    char NomArch[30];
    printf("Ingrese nombre de archivo: ");
    gets(NomArch);
    if ((yyin = fopen(NomArch, "rt")) == NULL)
    {
        printf("\nNo se puede abrir el archivo: %s\n", NomArch);
    }
    else
    {
        yylex();
    }
    fclose(yyin);
    getch();
    return 0;
}

Ahora bien, este script debemos enviarlo al Flex para que nos retorne un archivo en lenguaje C el cuál podemos integrar a nuestro proyecto que estamos realizando, de manera sencilla.

Lo primero que debemos hacer es descargar el archivo djgpp.rar, crear una carpeta llamada DJGPP en la unidad D:\ y descomprimir todos los archivos del *.rar aquí.


Luego debemos crear una carpeta en la unidad D:\ llamada PRUEBAS. Con esto será suficiente, pero es bueno recordar que las rutas son relativas. Eso sí, al momento de configurar las variables de entorno debemos tener cuidado de la ubicación de ambas carpetas.

Bueno, el siguiente paso es configurar el Flex para lo cuál haremos lo siguiente:
1. Presionar window+r y escribir cmd. Se abrirá la consola del windows, ahí debemos escribir lo siguiente:

d:
cd PRUEBAS
set djgpp=d:\djgpp\djgpp.env
set path=d:\djgpp\bin
flex -oanalisis.c FLE.L

 

Con esto se generará un archivo llamado analisis.c el cuál podemos integrarlo a nuesto proyecto en C. En este caso el archivo tiene su función main por lo que puede trabajar por si solo. Al ejecutar y enviarle un archivo con patrones léxicos veremos que nos devolverá los tokens correspondientes.

Acá les dejo un proyecto en Dev-C++, en la carpeta hay un archivo llamado test.txt el cuál es la entrada al programa.

Espero les sea de utilidad, y en un siguiente post explicaré como utilizar el Bison para analizar sintácticamente estructuraras más complejas como son las gramáticas.

Pueden revisar este post que explica cómo usar Bison en Windows:
O para algo más aplicativo puedes revisar esto:

34 comentarios:

ikari dijo...

gracias amigo, tu post esta buenisimo, tenia ya 3 cursos en la universidad de no poder configurar ninguna version de lex en las varias que existen y ahora ya he corrido unas pruebas y todo OK

saludos desde Guatemala

Andrey dijo...

Perdí todo el día tratando de compilar un LEX, hasta que encontré este post, Excelete Aporte. GRACIAS!! Desde Costa Rica

Anónimo dijo...

de la que me salvaste !!!!, gracias x tus aportes y x darles seguimiento

gersain dijo...

Gracias amigo me fue de gran ayuda desde apatzingan

gersain dijo...

Gracias amigo de la que me salvaste se te agradece

Hans Villagran dijo...

Gracias amigo, excelente aporte, con Bison es lo mismo?

Rolando dijo...

Te invito a revisar este post
http://rolandopalermo.blogspot.com/2010/01/configurando-bison-en-windows-para.html

Anónimo dijo...

Rolando!!

por finn pude generar los archivos tab.c y tab.h y todo gracias a tu post! me sirvio muchisimo tenia problemas con el bison para generar esos archivitos ahora podre probar y estudiar mas ejemplos que me piden en la facu.
Te agradezco mucho, muy buena tu pagina y muy bueno lo que haces de compartir informacion como esta: bien explicada y que realmente funciona! Saludos desde Argentina!

Anónimo dijo...

Felicidades por tan efectiva aportación en el tema. Enhorabuena!!!

Anónimo dijo...

Hola a todos, alguien me podria indicar por que cuando ejecuto flex -oanalisis.c FLE.L...me dice que flex.exe: can't open FLE.L

Anónimo dijo...

Hola a todos, alguien me podria indicar por que cuando ejecuto flex -oanalisis.c FLE.L...me dice que flex.exe: can't open FLE.L

Aleksco dijo...

@ 11 Anónimo
Pues lo que debes hacer es bajar el ejemplo en DEV -C++ que dejo nuestro amigo Rolando, y descomprimirlo, ahí vas a encontrar el archivo FLE.L que te da error, este archivo lo copias y lo pegas en la carpeta PRUEBAS, con eso ya te va a generar el archivo analisis.c
Saludos y Adelante.

Marcos Umaño dijo...

gracias amigazo! de diego!

Anónimo dijo...

asi surgen los mejores..gracias

Maythe dijo...

Muchiiisiimas gracias me has salvadoo la viidaa :D
:))

Anónimo dijo...

qien me puede decir como declaro palabras reservadas en el codigo porfas

Rolando dijo...

Este post te podría servir:
http://rolandopalermo.blogspot.com/2010/10/lex-y-bison-en-un-solo-analizador.html

Saludos.

CARLOS dijo...

HOLA, OYE DISCULPA TENGO UNA DUDA, YA AL ESCRIBIR EL ULTIMO COMANDO EL DE "flex -oanalisis.c FLE.L" ME APARECE UN MENSAJE QUE DICE: " "flex" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable " , Y NO SE QUE HACER, OJALA Y ME PUEDAS AYUDAR NO SE SI TENGA QUE VER , QUE ABRIR EL ARCHIVO FLE.L CON EL BLOC DE NOTAS ANTES DE ESCRIBIR LOS TRES COMANDO QUE NOS DICES ESCRIBIR, OJALA Y ME PUEDAS AYUDAR GRACIAS

Anónimo dijo...

disculpa me puedes ayudar tengo un problema al fina de escribir las ordenes k nos dice me aparece un mensaje k dice k FLEx no se reconoce como un programa o un archivo por lotes , etc etc, me puedes ayudar ??? grax

fkc23 dijo...

tengo la misma duda que los 2 ultimos comentarios...saludos!!!

Rolando dijo...

Hola, en primer lugar la recomendación es usar Windows XP y luego de eso deben de verificar que han creado las carpetas en los mismos directorios que indico en el post (D:\PRUEBAS).
Saludos.

Anónimo dijo...

oye necesariamente debe de ser un D: yo no tengo esa unidad y pues le hize en C: y ahí creé la carpeta "PRUEBAS" e hize todos los pasos mencionados pero igual me aparece el mensaje de "flex" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable ayudame por favor me urge gracias

CARLOS dijo...

oye disculpa necesariamente debo de crear la undiad "D" lo que pasa es que yo no tengo esa unidiad y lo hize en mi unidad "C" y ahí creé la carpeta "PRUEBAS" e hize todos los demas pasos y me apareció el mensaje "flex" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable , ojalá y me puedas ayudar por que si me urge mucho de antemano gracias

Anónimo dijo...

oye disculpa al final de los comandos en el ultimo me apare esto :
c:\PRUEBAS>flex -oanalisis.c FLE.L (despues de este comando le tecleo enter y me aparece)

c:/djgpp/bin/flex.exe: can´t open FLE.L

y pues no se que hacer por favor me ayudaria mucho si me dijeras cual es mi error nos vemos ye

Anónimo dijo...

no me funciono, los mismos comentarios anteriores no me reconoce el flex??

M dijo...

Sí funciona, excelente post.. Gracias..!
Último Anónimo, tienes que probar descomprimir todos los archivos de nuevo, identifica las rutas todas con letra mayúscula.. A mi así me funciono espero y a ti tambien

Anónimo dijo...

mmmmm vieras ya lo hice y me tira el mismo error, no se que puede ser, helpme please M

Anónimo dijo...

oye, no tienes flex y bison para correrlos en windows de 64 bits?

Rolando dijo...

No.

Nando dijo...

esto solo funciona para xp creo

miguel hernandez gonzalez dijo...

disculpa pero que contiene el archivo djgpp.rar

miguel hernandez gonzalez dijo...

disculapen pero que tiene el archivo djgpp.rar

Anónimo dijo...

A mi me pasó igual. Lo resolví porque me dí cuenta que escribía exactamente lo mismo que rolando, incluso la unidad. El trabajó y en la D, mientras que yo en la C y aún así cometí la burrada de escribir "djgpp=d:\djgpp\djgpp.env" y "path=d:\djgpp\bin" en lugar de "djgpp=c:\djgpp\djgpp.env" y "path=c:\djgpp\bin". Error de novatos jeje.

Saludos desde UN, Barranquilla, Colombia

Anónimo dijo...

Exelente explicacion me ayudo demasiado muchas gracias

Publicar un comentario