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. =)

Anuncios

14 Responses to “Flex+Bison+Qt4”


  1. julio 30, 2009 en 7:15 am

    Uff gracias hermano, justo lo que estaba buscando. Va a ser de gran ayuda para mi proyecto.

    Saludos …

  2. abril 15, 2010 en 4:18 am

    Gracielaaaaaa 🙂 🙂

  3. 3 dongo
    abril 28, 2010 en 12:07 am

    Buena onda voy a probarlo… gracias!!!

  4. 4 anonimo
    abril 30, 2010 en 4:30 am

    vos pero que archivo es el que va en la carpeta /tmp/archivo_para_el_parser de que me sale un error que no se puede escribir el archivo, de antemano gracias por tu respueta

    • 5 Jose
      abril 30, 2010 en 4:50 am

      Fijate q como el ejemplo es sencillo lo único que se hace es guardar lo que uno escribe en el lineedit (en este caso es ledEntrada) a un archivo temporal, ese archivo temporal es el que leerá el analizador. Ese archivo temporal se encuentra en el directorio tmp que se encuentra en el mismo directorio donde esta el ejecutable. Se tiene que tener permisos de escritura en esa carpeta para que se pueda guardar el archivo temporal, si tenemos el ejecutable en /usr/bin el temporal quedaria en /usr/bin/tmp y si somos usuarios normales el programa no va a poder guardar el archivo.

      Se puede hacer dos cosas: 1. mover el ejecutable a un lugar donde si podamos escribir. 2. abrir el archivo mainwindow.cpp y reemplazar:

      NombreArchivo=dir.homePath() + “/tmp/archivo_para_el_parser”;

      por:

      NombreArchivo=”/path/donde/tengamos/permisos/de/escritura/archivo_para_el_parser”; mejor si no se encuentran nombres con espacios)

      y volverlo a compilar. Con eso el programa ya debería poder guardar el archivo temporal q se mandara como parametro al parser.

      Exitos

  5. 6 anonimo
    mayo 9, 2010 en 5:25 pm

    primero gracias por el ejemplo y por responder a mi pregunta rapido, ahora tengo otra pregunta que ya he buscado por todo google y no la encuentro. Quiero utilizar en mi gramatica hecha en bison valores semanticos de tipo char, al imprimir un token cualquiera($1 por ejemplo) me tira una serie de caracteres raros, lo que supongo es que me tira basura debido a que en c++ todo es a base de reserva de memoria, y lo que supongo de que en mi flex debo de reservar ese espacio de memoria para poder trabajarlo en mi bison, ahora si hasta el momento estoy en lo correcto, como hago para que el token que retorno de flex a bison (Parser::id) me tire la palabra correcta que estoy retornando (variable1). Y si he estado mal, que debo de hacer, para corregirlo.

    • 7 Jose
      mayo 12, 2010 en 2:09 pm

      Fijate que yo también tuve problema con eso, busque y busque pero no encontré mucho, así que de igual manera probando y probando encontré una manera de hacerlo. El ejemplo que t puedo proponer lo voy a desarrollar y lo subo, como siempre no se si sea la mejor manera de hacerlo pero me funciono, solo dame un par de días y lo subo que ahorita estoy bien apretado 🙂

  6. 8 anonimo
    mayo 20, 2010 en 2:19 am

    gracias, buena onda!!!

  7. 12 anonimo
    mayo 25, 2010 en 12:59 am

    men, habra un metodo que retorne el numero de columna, por ejemplo con el lexer.lineno() te devuelve el numero de linea, pero ahora para obtener el numero de columna, alguna idea??

  8. 13 ada
    mayo 11, 2011 en 12:04 am

    Creo que esto me funcionara, y si es asi me acabas de hacer ganar compiladores 😀

  9. marzo 28, 2012 en 5:06 pm

    Desarrollar la aplicación con QT4 es interesante. He desarrollado una aplicación similar pero en Java que me gustaría compartir:
    http://rolandopalermo.blogspot.com/2010/10/lex-y-bison-en-un-solo-analizador.html
    Buen post amigo :D, Saludos.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


CGSOL 2008

Publicidad CGSOL 2008

A %d blogueros les gusta esto: