2. Flex en Windows (1/4) Usa MinGW (http://www.mingw.org/) Descarga e instala mingwgetinst (mingw-get-inst-20110211.exe)
3. Flex en Windows (2/4) Tras la instalación, ejecuta la aplicación MinGW Shell
4. Flex en Windows (3/4) Comprueba que están instalados: gcc flex Vim
5. Flex en Windows (4/4) ¿Dónde están los archivos? Si MinGW está instalado en C:/MinGW El directorio home se encuentra en C:inGWsys.0ome Flex genera un ejecutable Windows (.exe) que se puede ejecutar independientemente de MinGW Como un .exe cualquiera.
6. Usando flex. Ejemplo simple (1/2) simple.flex %%usernameprintf( "%s", "mariano" ); simple.text Esto es una prueba Linea 2. Linea 3 con un username y alguna cosa mas. Ultima linea.
7. Usando flex. Ejemplo simple (2/2) Lee simple.flex y genera el código C del parser en el fichero lex.yy.c Crea el parser compilando el fichero lex.yy.cc y linkando con la librería de flex (-L indica la ubicación de la librería de flex) El parser lee de stdin el texto a parsear, por eso se usa la pipa < Este parser sustituye username por mariano
8. Ejemplo simple2 (1/2) /* Esto es un comentario */ %{ /* Necesario para la funcionatof */ #include <math.h> %} DIGITO [0-9] ID [a-z][a-z0-9]* %% {DIGITO}+ { printf("Entero: %s (%d)", yytext, atoi(yytext)); } {DIGITO}+"."{DIGITO}* { printf("Un decimal: %s (%g)", yytext, atof(yytext)); } {ID} printf("Un identificador: %s", yytext); "/*"[^]*"*/" /* fuera comentarios de una linea */ [ ]+ /* fuera espacios o retornos o tabuladores */ . printf("Caracter raro: %s", yytext); %% main (intargc, char** argv){ ++argv, --argc; /* me salto el nombre del prog */ if (argc > 0){ yyin = fopen(argv[0], "r"); }else{ yyin = stdin; } yylex(); } Sección de definiciones simple2.flex Sección de reglas En lugar de stdin, que lea de un fichero (argumento de flex) Sección de ejecución
9. Ejemplo simple2 (2/2) Genero el código C del parser Genero el parser Contenido del fichero de prueba Resultado de la ejecución
10. Ejemplo email (1/2) email.flex /* Esto es un comentario */ %{ /* Necesario para la funcionatof */ #include <math.h> %} USER [a-z][a-z0-9]* HOST [a-z][a-z0-9]* %% {USER}"@"{HOST} { printf("Un email: %s ", yytext); } [ ]+ /* fuera espacios o retornos o tabs*/ . /*printf("Caracter raro: %s", yytext);*/
11. Ejemplo email (2/2) Genero el código C del parser Genero el parser Contenido del fichero de prueba Resultado de la ejecución
12. Mail mejorado El anterior no consideraba los dominios separados por . Sólo contemplaba algo@algo