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:

  1. 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

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

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

    ResponderEliminar
  4. Gracias amigo me fue de gran ayuda desde apatzingan

    ResponderEliminar
  5. Gracias amigo de la que me salvaste se te agradece

    ResponderEliminar
  6. Gracias amigo, excelente aporte, con Bison es lo mismo?

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

    ResponderEliminar
  8. 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!

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

    ResponderEliminar
  10. 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

    ResponderEliminar
  11. 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

    ResponderEliminar
  12. @ 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.

    ResponderEliminar
  13. asi surgen los mejores..gracias

    ResponderEliminar
  14. Muchiiisiimas gracias me has salvadoo la viidaa :D
    :))

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

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

    Saludos.

    ResponderEliminar
  17. 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

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
  18. 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

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

    ResponderEliminar
  20. 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.

    ResponderEliminar
  21. 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

    ResponderEliminar
  22. 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

    ResponderEliminar
  23. 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

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

    ResponderEliminar
  25. 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

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

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

    ResponderEliminar
  28. disculpa pero que contiene el archivo djgpp.rar

    ResponderEliminar
  29. disculapen pero que tiene el archivo djgpp.rar

    ResponderEliminar
  30. Exelente explicacion me ayudo demasiado muchas gracias

    ResponderEliminar