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:
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
ResponderBorrarsaludos desde Guatemala
Perdí todo el día tratando de compilar un LEX, hasta que encontré este post, Excelete Aporte. GRACIAS!! Desde Costa Rica
ResponderBorrarde la que me salvaste !!!!, gracias x tus aportes y x darles seguimiento
ResponderBorrarGracias amigo me fue de gran ayuda desde apatzingan
ResponderBorrarGracias amigo de la que me salvaste se te agradece
ResponderBorrarGracias amigo, excelente aporte, con Bison es lo mismo?
ResponderBorrarTe invito a revisar este post
ResponderBorrarhttp://rolandopalermo.blogspot.com/2010/01/configurando-bison-en-windows-para.html
Rolando!!
ResponderBorrarpor 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!
Felicidades por tan efectiva aportación en el tema. Enhorabuena!!!
ResponderBorrarHola 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
ResponderBorrarHola 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
ResponderBorrar@ 11 Anónimo
ResponderBorrarPues 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.
gracias amigazo! de diego!
ResponderBorrarasi surgen los mejores..gracias
ResponderBorrarMuchiiisiimas gracias me has salvadoo la viidaa :D
ResponderBorrar:))
qien me puede decir como declaro palabras reservadas en el codigo porfas
ResponderBorrarEste post te podría servir:
ResponderBorrarhttp://rolandopalermo.blogspot.com/2010/10/lex-y-bison-en-un-solo-analizador.html
Saludos.
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
ResponderBorrarA 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.
BorrarSaludos desde UN, Barranquilla, Colombia
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
ResponderBorrartengo la misma duda que los 2 ultimos comentarios...saludos!!!
ResponderBorrarHola, 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).
ResponderBorrarSaludos.
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
ResponderBorraroye 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
ResponderBorraroye disculpa al final de los comandos en el ultimo me apare esto :
ResponderBorrarc:\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
no me funciono, los mismos comentarios anteriores no me reconoce el flex??
ResponderBorrarSí funciona, excelente post.. Gracias..!
ResponderBorrarÚ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
mmmmm vieras ya lo hice y me tira el mismo error, no se que puede ser, helpme please M
ResponderBorraroye, no tienes flex y bison para correrlos en windows de 64 bits?
ResponderBorrarNo.
ResponderBorraresto solo funciona para xp creo
ResponderBorrardisculpa pero que contiene el archivo djgpp.rar
ResponderBorrardisculapen pero que tiene el archivo djgpp.rar
ResponderBorrarExelente explicacion me ayudo demasiado muchas gracias
ResponderBorrar