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.
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:
$flex test.l
$gcc -o test lex.yy.c
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:
$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;
}
Tienes razón, modifique el código y lo compile para probar
%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:
$flex lex.l
$gcc lex.yy.c -o lex
$cat lex.l | ./lex
Esta fue la salida:
193 caracteres en 19 lineas