Flex y Bison en Windows
Hay varias formas de usar Flex y Bison en Windows. A continuación, mi forma preferida:
MSYS2
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.
Instalar MSYS2
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
Instalar Flex
Para instalar Flex basta con ejecutar el siguiente comando:
pacman -S flex
Comprueba si se instaló correctamente con:
flex --version
Problema con la librería fl
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: https://github.com/msys2/MSYS2-packages/issues/1911#issuecomment-832199076
Instalar Bison
Lo mismo con Bison:
pacman -S bison
Comprueba la instalación con:
bison --version
Instalar GCC
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
Instalar Make
Para instalar Make ejecuta:
pacman -S make
Para comprobar que se instaló:
make --version
Cómo usar lo instalado
Para aprovechar el compilador instalado es necesario usar el entorno UCRT. A continuación se indica cómo hacerlo en algunas terminales.
Terminal de MSYS2
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.
Terminal de Visual Studio Code
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"
}
}
}
Windows Terminal
Añade un nuevo perfil con las siguientes opciones (modifica E:/msys64
según tu ruta de instalación):
Línea de comandos
E:\msys64\msys2_shell.cmd -defterm -here -no-start -ucrt64
Ícono (opcional)
E:\msys64\ucrt64.ico
Más información
Lee más sobre MSYS2 en su Documentación.
Ejemplo
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