Introducción a flex

2
33195

Introducción a Flex

A medida que vas madurando, te vas dando cuenta que aquellos conocimientos
que habías dejado pasar por alto, empiezan a encajar en un mapa global del
conocimiento.

Hoy me he encontrado un problema y he decidido solucionarlo de un modo
creativo utilizando el generador de analizadores léxicos Flex en el entorno
Windows … y de camino repaso el uso de expresiones regulares (importante y
útil a muchas tecnologías)

Mi problema es sencillo, tengo un fichero de backup de mi teléfono Nokia 7710
(con un formato muy particular) y he decidido tratar de exportarlo a un fichero
de texto plano con el menor esfuerzo posible.

Como podéis ver, el formato del backup de contactos del Nokia no tiene
desperdicio así que ¿y si quitamos lo que sobra y dejamos solo los números y
nombres?

Si vamos a Internet, en Google y buscamos flex-es pdf, encontraremos la
documentación en castellano en un montón de Webs


 

Ahora lo que nos hace falta es bajarnos la distribución de flex, en nuestro
caso para Windows


http://gnuwin32.sourceforge.net/packages/flex.htm

El proceso de instalación es trivial

Elegimos el trayecto de instalación

Y ahora, vamos a definir un patrón ejemplo (del propio tutorial) para probar
que toda va bien y así aprendemos a configurar el compilador de Microsoft de C++
para que todo funcione bien.

El patrón a utilizar es:

int num_lineas = 0, num_caracteres = 0;

%%
\n ++num_lineas; ++num_caracteres;
. ++num_caracteres;

%%
main()
{
yylex();
printf( «# de líneas = %d, # de caracteres. = %d\n», num_lineas,
num_caracteres );
}

 

Lo guardamos en el fichero:    mf.txt

Los patrones tienen una estructura sencilla: Una parte para
declaraciones, una parte para definición de patrones (y el código a
ejecutar) y una parte final con el código principal del programa C que se va
a generar.

Ahora, solo hace falta ejecutar el generador de analizadores
léxicos desde la línea de comando

flex mf.txt

Se ha generado un programa C llamado lex.yy.c que podemos
importar en un proyecto en nuestro compilador

No olvidar que para que funcione hace falta linkar con las librerías de Flex.
Añadimos el trayecto donde se encuentran las librerías

Y en las opciones de linkado (perdonar los puristas) añadimos el
nombre de la librería libfl.a

Ahora solo tenemos que compilar y ejecutar el programa generado, enviándole
el fichero a procesar.

C:\Documents and Settings\…\Roberto\Debug>flexejem.exe
< buildlog.htm
# de lineas = 53, # de caracteres. = 9720

Por último, falta escribir nuestro analizador sintáctico
particular, que lo vamos a usar al revés. Me explico: Cuando definimos un
patrón de actuación, lo que no cumple ese patrón es dejado pasar sin más.
Pues vamos a definir, en vez de los patrones de lo que nos interesan, los de
lo que no nos interesa y no hacer nada con ello, de este modo,  lo que
salga, es lo que nosotros estamos buscando.

int i = 0;

letra [a-zA-Z]
numero [0-9]
letranum {letra}|{numero}

%%

^{letranum} /* No hacemos nada */
; /* No hacemos nada */
[\t ] /* No hacemos nada */
.*BEGIN:VCARD /* No hacemos nada */
.*END:VCARD /* No hacemos nada */
{letranum}*: /* No hacemos nada */
2.1 /* No hacemos nada */
EL{letra}* /* No hacemos nada */
2005.* /* No hacemos nada */
ENCODING.* /* No hacemos nada */
VOICE? /* No hacemos nada */

%%
main( )
{
yylex();
}

 

 Con esta tontería, nuestra salida queda limpia ….
¿no os parece original?

 

Algunos links de interés

http://wwwdi.ujaen.es/~nacho/Flex.htm

http://pisuerga.inf.ubu.es/cgosorio/ALeF/PRAC/lex.t.pdf

 

Conclusiones

¿Que es más importante? Ser el mega experto en una sola
tecnología o haber trabajado con muchas y tener la visión para
aplicar/criticar con criterio.

Si habéis jugado con Flex ¿los
parsers XML os parecen algo tan distinto? Más cómodo seguro que sí pero los
conceptos son muy parecidos ….

 

2 Comentarios

  1. Querido Roberto, he seguido los pasos del tutorial, tengo como compilador de C/C++, es Visual studio 2008, cree el proyecto, y cambie la configuración como usted lo muestra, pero al momento de compilar me muestra 4 errores:
    Error 1 error C2065: \\\’num_lineas\\\’ : identificador no declarado mf.txt flexproy
    Error 2 error C2065: \\\’num_caracteres\\\’ : identificador no declarado mf.txt flexproy
    Error 3 error C2065: \\\’num_caracteres\\\’ : identificador no declarado mf.txt flexproy
    Error 8 error C2065: \\\’num_lineas\\\’ : identificador no declarado mf.txt flexproy
    Error 9 error C2065: \\\’num_caracteres\\\’ : identificador no declarado mf.txt flexproy

    y no me genera el archivo, además, veo en el tutorial que hay un archivo llamado stdafx.h y otro stdafx.cpp, que son esos archivos, para que son?, es posible que por esos me este marcando los errores?, agradezco una guía, ya que no he trabajado sino con borlandc 3.1 y no lo he hecho con otros ides, y tengo la necesidad de aprender a usar el flex. Gracias

Dejar respuesta

Please enter your comment!
Please enter your name here