Hay varias formas de usar Flex y Bison en Windows. A continuación, mi forma preferida:
MSYS2 es un conjunto de herramientas para el desarrollo de software en Windows. Puedes leer más en su sitio web.
¿Por qué lo elijo? Básicamente porque es un paquete todo-en-uno que incluye GCC, Flex, Bison y mucho más.
Primero descarga el instalador en https://www.msys2.org/#installation.
Ejecuta el instalador.
La ruta de instalación debe contener solo caracteres ASCII, ningún espacio y estar en un volumen NTFS.
Una vez instalado, ejecuta MSYS2 (puedes buscarlo en Inicio) y lo primero que harás es actualizar todo con el siguiente comando:
pacman -Suy
Para instalar Flex basta con ejecutar el siguiente comando:
pacman -S flex
Comprueba si se instaló correctamente con:
flex --version
Esta manera de usar Flex no permite usar -lfl
al compilar el código
generado, pero como esta librería solo define main
y yywrap
es sencillo
solucionarlo.
Antes que nada, prueba compilar sin -lfl
. Si defines tu propio main
y no
usas yywrap
, debería funcionar sin problemas.
Si surge algún error, deberás incluir la función que necesites.
Extraído de libmain.c.
int main (int argc, char *argv[]) {
(void)argc;
(void)argv;
while(yylex() != 0);
exit(0);
}
Extraído de libyywrap.c.
int yywrap(void) {
return 1;
}
Comentario sobre el problema: msys2/MSYS2-packages#1911 (comment)
Lo mismo con Bison:
pacman -S bison
Comprueba la instalación con:
bison --version
Para GCC usa:
pacman -S mingw-w64-ucrt-<TU ARQ>-gcc
Donde <TU ARQ>
es la arquitectura de tu computadora (la misma que usaste al
instalar MSYS2). Por ejemplo, para 64 bits puedes usar:
pacman -S mingw-w64-ucrt-x86_64-gcc
UCRT
permite usar tildes en C, entre otras cosas.
Para verificar si se instaló, debes usar el siguiente comando en una terminal como se indica más abajo:
gcc --version
Para instalar Make ejecuta:
pacman -S make
Para comprobar que se instaló:
make --version
Para aprovechar el compilador instalado es necesario usar el entorno UCRT. A continuación se indica cómo hacerlo en algunas terminales.
Busca en Inicio MSYS2 UCRT
y ejecuta una opción que incluya UCRT
en el
nombre. Por ejemplo, en mi caso es MSYS2 MinGW UCRT x64.
Añade lo siguiente a settings.json
:
{
// Otras opciones...
"terminal.integrated.profiles.windows": {
// Otros perfiles...
// Nombre que identificará al perfil
"MSYS2 UCRT64": {
// Esto depende de tu ruta de instalación
"path": "E:\\msys64\\usr\\bin\\bash.exe",
"args": ["--login", "-i"],
"env": {
// Depende de tu arquitectura (UCRT o UCRT64)
"MSYSTEM": "UCRT64",
// Inicia la terminal en la carpeta del proyecto
"CHERE_INVOKING": "1"
},
// Opcional
"icon": "terminal-bash"
}
}
}
Añade un nuevo perfil con las siguientes opciones (modifica E:/msys64
según tu
ruta de instalación):
E:\msys64\msys2_shell.cmd -defterm -here -no-start -ucrt64
E:\msys64\ucrt64.ico
Lee más sobre MSYS2 en su Documentación.
Esto comprueba si gcc
, flex
y make
funcionan correctamente.
Crea los siguientes archivos en alguna carpeta vacía:
ejemplo.c
%option noyywrap
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+ {words++; chars += strlen(yytext);}
\n {chars++; lines++;}
. {chars++;}
%%
int main(int argc, char **argv) {
yylex();
printf(
"Líneas: %d\nPalabras: %d\nCaracteres: %d\n",
lines, words, chars
);
}
Makefile
ejemplo: lex.yy.c
gcc lex.yy.c -o ejemplo.exe
lex.yy.c: ejemplo.l
flex ejemplo.l
Abre una terminal (como se indicó más arriba) en esa carpeta y ejecuta:
make
Si todo sale bien, deberían crearse lex.yy.c
y ejemplo.exe
.
Ejecuta ejemplo.exe
desde una terminal (para ver el resultado cuando el
programa finalize) y escribe algún texto.
The boy stood on the burning deck
shelling peanuts by the peck
^Z # CTRL Z (CTRL D en Linux)
Presionar ENTER
luego de CTRL
Z
interrumpe y finaliza la ejecución.
Líneas: 2
Palabras: 12
Caracteres: 63