Archivos para la Categoría 'Uncategorized'

12
Jun
09

Flex+Bison+Qt4

Bueno, hoy quiero compartir algo con todos, como trabajar con flex y bison en Qt4. Tenia un proyecto en la universidad, investigue e investigue y no encontre casi nada de información acerca de este tema, encontraba muchos ejemplos comunes del uso de flex y bison pero no como usarlo con Qt4. Encontre algunas cositas como QLALR pero me dio hueva estudiarlo asi que mejor le entre solo a flex y bison. Encontré otros que primero creaban el ejecutable del analizador y luego con un QProcess usaban ese ejecutable, pero no me gusto, creo que es mejor generar el código de los analizadores y luego integrarlos con el proyecto de Qt4, asi que eso vamos a hacer.

Antes que nada quiero decirles que no es la gran cosa el ejemplo, ni se si será la mejor manera de hacerlo, pero me funciono muy bien.

En este ejemplo haremos una calculadora, en el código se muestra como trabajar con archivos para mandarselo como parametro al parser y un objeto Acciones que sirve de intermediario por asi decirlo entre el proyecto Qt4 y el parser. Este no es un turorial de flex y bison asi que solo me voy a limitar en la union con Qt4. Estoy utilizando flex 2.5.35 y bison++ 1.21-8 en GNU/Linux.

Proyecto de ejemplo: prueba_qt4_flex_bison.tar.gz

En el archivo scanner.l estan las reglas del analizador léxico. Para generar el código en C++ ejecutamos lo siguiente en la carpeta donde esta el archivo:

flex -d -o scanner.cc scanner.l

Ese comando nos crea el archivo scanner.cc.

En el archivo parser.y estan las reglas del analizador sintactico y semantico. Para generar el código C++ ejecutamos lo siguiente en la carpeta donde esta el archivo:

bison++ -d -hparser.h -o parser.cc parser.y

Ese comando nos crear dos archivos: parser.cc y parser.h

Ahora abrimos el archivo prueba_qt4_flex_bison.pro con Qt Creator y lo compilamos.

Ya con eso tenemos una sencilla calculadora, ahora solo falta probarla: escribir “2+3*4“, tiene que salir 14

Si se necesita tambien para Windows, pues, el mismo código generado por flex y bison funciona. No se porque el código que genera flex para DOS/Windows no compila, tampoco he tenido tiempo para investigarlo asi que simplemete copie FlexLexer.h que esta en /usr/include y lo pegue en la carpeta de las cabeceras de mingw32, con eso compila nitido en Windows y nuestro programa es multiplataforma.

Espero que les sirva. =)




CGSOL 2008

Publicidad CGSOL 2008