Test Foro de elhacker.net SMF 2.1

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:

int nl = 0, nc = 0;
%%
\n  ++nl; ++nc;
.   ++nc;
%%
int main()
{
    yylex();
    printf( "%d caracteres en %d lineas\n", nc, nl);
    return 0;
}


Procesar con flex y compilar:

Código (bash) [Seleccionar]
$flex test.l
$gcc -o test lex.yy.c

Título: Re: duda con flex y bison
Publicado por: yoxter en 27 Agosto 2012, 04:04 AM
Cita de: 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:

int nl = 0, nc = 0;
%%
\n  ++nl; ++nc;
.   ++nc;
%%
int main()
{
    yylex();
    printf( "%d caracteres en %d lineas\n", nc, nl);
    return 0;
}


Procesar con flex y compilar:

Código (bash) [Seleccionar]
$flex test.l
$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
%{
int nl = 0, nc = 0;
%}
%%
\n  ++nl; ++nc;
.   ++nc;
%%
int main()
{
    yylex();
    printf( "%d caracteres en %d lineas\n", nc, nl);
    return 0;
}


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 (cpp) [Seleccionar]
%option noyywrap
%{
#include <stdio.h>
int nl = 0, nc = 0;
%}

%%
\n  ++nl; ++nc;
.   ++nc;
%%

int main()
{
    yylex();
    printf( "%d caracteres en %d lineas\n", nc, nl);
    return 0;
}


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


Esta fue la salida:

193 caracteres en 19 lineas