martes, 26 de enero de 2010

Configurando Bison en Windows

Como podemos leer en la wikipedia, GNU|bison es un programa generador de analizadores sintácticos de propósito general perteneciente al proyecto GNU disponible para prácticamente todos los sistemas operativos, se usa normalmente acompañado de flex aunque los analizadores lexicos se pueden también obtener de otras formas. En un post anterior mencioné la forma en que uno podía configurar Flex para realizar analizadores léxicos. Bueno, en esta oportunidad vamos a desarrollar una sencilla calculadora con Bison y Flex. Los pasos para configurar el flex, nos dejan configurado al bison, listo para ser usado en nuestra calculadora. Ahora, voy a pasar a explicar la forma que deben tener los scripts que ingresaremos tanto a flex como a bison.

Para flex el script debe tener la siguiente estructura:

%{

#include <stdio.h>
#include "y.tab.h"
%}
%option noyywrap
%option yylineno

DIGITO [0-9]
ID [a-zA-Z][a-zA-Z0-9_]*

%%
{DIGITO}+("."{DIGITO}+)? {yylval.real=atof(yytext); return(TKN_NUM);}
"="    {return(TKN_ASIGN);}
";"    {return(TKN_PTOCOMA);}
"*"    {return(TKN_MULT);}
"/"    {return(TKN_DIV);}
"+"    {return(TKN_MAS);}
"-"    {return(TKN_MENOS);}
{ID}   {return(TKN_ID);}
%%

Como nos podemos dar cuenta, en este fichero declaramos los símbolos y las expresiones que forman a los token numero (TKN_NUM). Asumo que ya tienen conocimiento de cada una de las partes de un archivo de flex, así que ahora paso a mostrar la forma que debe tener el archivo que le ingresaremos a Bison:

%{

#include <stdio.h>
#include <math.h>
extern int yylex(void);
extern char *yytext;
void yyerror (char *s);

%}

%union
{
float real;
}

%start Calculadora

%token <real> TKN_NUM
%token TKN_ASIGN
%token TKN_PTOCOMA
%token TKN_MULT
%token TKN_DIV
%token TKN_MAS
%token TKN_MENOS

%token <real> TKN_ID
%type <real> Expresion

%left TKN_MAS TKN_MENOS
%left TKN_MULT TKN_DIV

%%

Calculadora: TKN_ID {printf("El valor de %s es:", yytext);}
TKN_ASIGN Expresion TKN_PTOCOMA{printf("%5.2f", $4);};
Expresion : TKN_NUM{$$=$1;}|
Expresion Expresion TKN_MAS {$$=$1+$2;}|
Expresion Expresion TKN_MENOS {$$=$1-$2;}|
Expresion Expresion TKN_MULT {$$=$1*$2;}|
Expresion Expresion TKN_DIV {$$=$1/$2;};

%%

void yyerror(char *s)
{
printf("Error %s", s);
}

int main()
{
yyparse();
return 0;
}

Tampoco voy a explicar la estructura de este fichero puesto que la documentación en internet es muy variada. Lo que si voy a detallar es la forma de obtener los ficheros *.c y *.h, puesto que, a mi parecer, es lo más confuso y poco explicado.

Como mencioné anteriormente, al configurar el flex siguiendo los pasos que expliqué en el post anterior el Bison quedará configurado también. Así que solo hay que realizar los siguientes comandos por consola y tendremos todo listo para integrarlo a nuestro proyecto de Dev-C++.

Situamos ambos ficheros en el directorio D:\calculadora(Si no existe, tenemos que crearlo, lógicamente) y luego abrimos una consola de Windows, hacemos lo mismo que hicimos con el Flex, estableciendo las variables de entorno, como muestro en la siguiente imagen:

Y con esos comandos se nos generará unos ficheros, los cuales automáticamente podemos integrarlo a un proyecto de Dev-C++ por ejemplo o agregarle más funciones.


Ahora ya tenemos lista nuestra sencilla calculadora escrita con ayuda de Bison y Flex. Solo debemos ejecutar Calculadora.exe e ir introduciendo algunas expresiones (En notación polaca claro)

a=4 5+;
hola=8 12*;
g=12 6/;

Aquí les dejo la carpeta del proyecto con los archivos tanto de flex como de bison. También les muestro la forma de correr el programa de la calculadora en la siguiente imagen:

Para algo más aplicativo puedes revisar esto:

21 comentarios:

Anónimo dijo...

mmm la pregunta es para qué yo necesitaría una calculadora con notación Polaca en el Perú?

Rolando dijo...

Si lo ves así obviamente que no habrá una respuesta adecuada, pero el uso de este tipo de analizadores y el correcto manejo de los mismos te ayudará a estructurar proyectos más grandes que si sean de gran utilidad en el Perú. Ese es el fin del post: Aprender un poco acerca de su configuración y uso.

Anónimo dijo...

Amigo perdona, estoy realizando esta prueba de la calculadora pero so estoy compilando en borland c++, me podrias indicar cual es el procedimiento completo para generar mi ejecutable. (actualmente solo abro el archivo lexyy.c pero me da error sin duda estoy haciendo algo mal)Agradezco tu ayuda

Gaby dijo...

Hola Rolando, tu post esta genial me ha sido de gran ayuda muchas gracias. Tengo un problema al igual que "anonimo", no puedo generar el ejecutable yo estoy utilizando dev c++,pero de hecho no puedo hacerlo correr no marca error simplemente no sale nada no se abre la ventana. Cualquier tip que me puedas proporcionar te lo agradezco mucho.

saludos!

Rolando dijo...

@Gaby, hay un link de descarga de un proyecto en dev c++. Has probado compilando ese proyecto?

Gaby dijo...

Gracias por responder Rolando. Si lo descargue pero tampoco me permite compilarlo desde dev c++ solo lo puedo correr con el ejecutable que incluyes en la carpeta. Crees que tiene que ver que yo tengo windows vista? o a lo mejor la versión del dev c++?

Rolando dijo...

Hola @Gaby. te comento que yo compilé ese proyecto en windows XP y no me ha dado ningún problema. Te recomendaría que hagas lo mismo pues a lo mejor ese es el problema. Bueno, te contaré que no soy muy fanático del Dev c++ tampoco ^^ ... en el lapso de esta semana trataré de compilar proyectos en otros entornos xD!!!
Saludos.

Gaby dijo...

Gracias por la respuesta Rogelio, efectivamente parece que es el windows vista; ya lo compile en windows XP con la misma versión que tenía de Dev c++ y todo perfecto :)

gracias por todo!! saludos!

Rolando dijo...

Jajaja, mi nombre es Rolando, no rogelio ^^.
Que bueno que te haya funcionado. Saludos desde Trujillo - Perú.

Gaby dijo...

Ups fue un error de dedo perdon ;)

Saludos desde México!

Hans Villagran dijo...

Rolando, muchisimas gracias, en algunos dias tendre que usar Bison y gracias a tu aporte no dependeré del SO.
Saludos desde Chile

Rolando dijo...

Me alegra que te sea de utilidad las cosas aquí posteadas. Lo único que busco es compartir el conocimiento y comentarios como el tuyo son el tipo de pago que deseo recibir por las cosas que escribo.
Saludos desde Perú.

Anónimo dijo...

gracias por las aportaciones en la materia de compiladores es dificil encontrar informacion que sea correcta ya que hay muchos manuales con codigos que no funcionan. Ha sido muy útil para impartir esta materia a nivel superior.

mariano dijo...

Que tal Rolando espero te encuentres bien es bueno saber que exiten personas como tu que comparten sus conocimientos con todos nosotros, me ha servido de mucho.
Pero tengo en siguiente problema cuando trato de compilar el script de bison me salen cosas raras y nada mas no lo compila, trabajo bajo seven y ya lo probe en XP y sigue con lo mismo incluso compile el archivo que proporcionas en el rar y lo mismo, me sale algo como lo siguiente:

m4: cannot open `de': No such file or directory
m4: cannot open `programa\GnuWin32/share/bison': No such file or directory
m4: cannot open `C:\Archivos': No such file or directory
m4: cannot open `de': No such file or directory
m4: cannot open `programa\GnuWin32/share/bison/m4sugar/m4sugar.m4': No such file
or directory

no hice un copy paste, fui copiando linea por linea para irlo analizando espero puedas ayudarme a resolver este problema de antemano gracias!!!

Rolando dijo...

Definitivamente tienes problemas con las rutas amigo. Te recomiendo leas primero este otro post:

http://rolandopalermo.blogspot.com/2009/12/como-configurar-flex-en-windows-y-no.html

Luego intenta configurar el Bison, pero esta vez usando la configuración de las rutas del post del que te mandé el enlace.

Saludos.

Anónimo dijo...

Exelente Amigo...funciona en win7, solo tiene que estar empaquetado con dev c++.

Saludos

Rolando dijo...

Si amigo, si funciona!

Anónimo dijo...

Caray amigo, muchisimas gracias por la informacion, hemos tenido algunos problemillas al usarlo en sistemas operativos de 64 bits, pero lo solucionamos metiendolo en un virtualbox, aún así, la información se agradece!!
Saludos desde México

Anónimo dijo...

tienen una mquina d turin hecho en lexy yacc o flex y bison

Anónimo dijo...

Saludos, una pregunta... compilo bien los archivos, pero al ejecutar me manda un error "Error parse error" podrias ayudarme, gracias!

Ernesto Calderon Laureano dijo...

LOgre compilarlo , me intereso muchocimo
Otro programa acompañado de flex
x favor

Publicar un comentario