Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: yoxter en 27 Agosto 2012, 03:04 am



Título: duda con flex y bison
Publicado por: yoxter en 27 Agosto 2012, 03:04 am
Saludos,
estoy aprendiendo flex y bison bajo c, pero me surge una duda, solo he visto lo basico de flex y me doy cuenta que es como un interprete (al estilo rails), es decir no puedo utilizarlo para traducir directamente el codigo que introduzca a c y luego compilar el codigo de c.  espero haberme expresado correctamente.


Título: Re: duda con flex y bison
Publicado por: fabianjsm en 27 Agosto 2012, 03:44 am
Flex es un compilador cruzado, es decir, recibe un código y genera código para otro compilador. No deberías modificar su salida, cada vez que quieras realizar un cambio modificas el fuente, generalmente con extensión l, y vuelves a procesarlo con flex.

La salida de flex puede ser directamente compilada, sin más procesamiento. Si tienes el main dentro del fuente de lex, su salida puede ser compilada y enlazada para genera el ejecutable. Este es un ejemplo clásico de este caso:

Código
  1. int nl = 0, nc = 0;
  2. %%
  3. \n  ++nl; ++nc;
  4. .   ++nc;
  5. %%
  6. int main()
  7. {
  8.    yylex();
  9.    printf( "%d caracteres en %d lineas\n", nc, nl);
  10.    return 0;
  11. }

Procesar con flex y compilar:

Código
  1. $flex test.l
  2. $gcc -o test lex.yy.c


Título: Re: duda con flex y bison
Publicado por: yoxter en 27 Agosto 2012, 04:04 am
Flex es un compilador cruzado, es decir, recibe un código y genera código para otro compilador. No deberías modificar su salida, cada vez que quieras realizar un cambio modificas el fuente, generalmente con extensión l, y vuelves a procesarlo con flex.

La salida de flex puede ser directamente compilada, sin más procesamiento. Si tienes el main dentro del fuente de lex, su salida puede ser compilada y enlazada para genera el ejecutable. Este es un ejemplo clásico de este caso:

Código
  1. int nl = 0, nc = 0;
  2. %%
  3. \n  ++nl; ++nc;
  4. .   ++nc;
  5. %%
  6. int main()
  7. {
  8.    yylex();
  9.    printf( "%d caracteres en %d lineas\n", nc, nl);
  10.    return 0;
  11. }

Procesar con flex y compilar:

Código
  1. $flex test.l
  2. $gcc -o test lex.yy.c


Saludos gracias por la respuesta.

eso es a lo que me refiero el archivo que genereas a partir del lex.yy.c es mas parecido a un interprete, lo que quiero (sin animo de crear nada serio) es un compilador.

pd : el codigo deberia ir asi
Código
  1. %{
  2. int nl = 0, nc = 0;
  3. %}
  4. %%
  5. \n  ++nl; ++nc;
  6. .   ++nc;
  7. %%
  8. int main()
  9. {
  10.    yylex();
  11.    printf( "%d caracteres en %d lineas\n", nc, nl);
  12.    return 0;
  13. }
  14.  



Título: Re: duda con flex y bison
Publicado por: fabianjsm en 29 Agosto 2012, 05:26 am
Tienes razón, modifique el código y lo compile para probar

Código
  1. %option noyywrap
  2. %{
  3. #include <stdio.h>
  4. int nl = 0, nc = 0;
  5. %}
  6.  
  7. %%
  8. \n  ++nl; ++nc;
  9. .   ++nc;
  10. %%
  11.  
  12. int main()
  13. {
  14.    yylex();
  15.    printf( "%d caracteres en %d lineas\n", nc, nl);
  16.    return 0;
  17. }

'%option noyywrap' para que no requiera esta función.
Lo compilé y lo probé de este modo:
Código
  1. $flex lex.l
  2. $gcc lex.yy.c -o lex
  3. $cat lex.l | ./lex

Esta fue la salida:

193 caracteres en 19 lineas