Skip to content

Instantly share code, notes, and snippets.

@CrysoK
Last active September 6, 2022 20:24
Show Gist options
  • Save CrysoK/a682b57550fd89227e525c7f85114500 to your computer and use it in GitHub Desktop.
Save CrysoK/a682b57550fd89227e525c7f85114500 to your computer and use it in GitHub Desktop.

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: msys2/MSYS2-packages#1911 (comment)

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment