duda con flex y bison

Iniciado por yoxter, 27 Agosto 2012, 03:04 AM

0 Miembros y 1 Visitante están viendo este tema.

yoxter

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.



Posiblemente soy el intento de programador mas fracaso de la historia !!

fabianjsm

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


yoxter

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;
}





Posiblemente soy el intento de programador mas fracaso de la historia !!

fabianjsm

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