Coder Social home page Coder Social logo

ssl-flex-bison-projects's Introduction

ssl-flex-bison-projects

Una forma más sencilla de compilar tus proyectos de Flex y Bison.

image

¿Qué debo tener instalado?

¿Qué debo tener instalado en Windows?
  1. MinGW y GCC con las variables de entorno incluidas.

  2. Los siguientes programas de GnuWin32 (la opción que dice "Complete package, except sources") instalado en una carpeta sin espacios (puede ser, al igual que para MinGW, C:\GnuWin32):

La variable de entorno PATH debe apuntar hacia la subcarpeta bin (ej: C:\GnuWin32\bin).

  1. Crear una nueva variable de entorno llamada LIBRARY_PATH y asignarle como valor la ruta hacia la subcarpeta lib (ej: C:\GnuWin32\lib)1.

image

  1. Windows Terminal (recomendado).

  2. Una consola Bash, que puede ser la que viene con Git.

Para poder abrirla desde Windows Terminal, cuando estemos instalando Git debemos tildar la opción que dice "Add a Git Bash profile to Windows Terminal":

¿Qué debo tener instalado en Ubuntu?

Make y gcc vienen instalados en forma nativa, se puede averiguar con el flag --version:

$ gcc --version
$ make --version

En el caso de Flex y Bison, se pueden obtener con el gestor de paquetes apt-get:

$ sudo apt-get install libfl-dev libbison-dev

¿Cómo lo descargo?

Para descargar los templates deberemos abrir una consola Bash y ejecutar:

  • Para Flex:
$ mkdir "nombre-del-proyecto"

$ cd nombre-del-proyecto

$ curl -fsSL https://github.com/RaniAgus/ssl-flex-bison-projects/releases/download/v1.1/flex-v1.1.tar.gz \
 | tar xvzf - --strip-components 1
  • Para Bison:
$ mkdir "nombre-del-proyecto"

$ cd nombre-del-proyecto

$ curl -fsSL https://github.com/RaniAgus/ssl-flex-bison-projects/releases/download/v1.1/bison-v1.1.tar.gz \
 | tar xvzf - --strip-components 1

¿Dónde pongo mis archivos?

En el repo se encuentran dos archivos makefile (uno para solo flex y otro para flex y bison), los cuales se rigen bajo la siguiente estructura para funcionar:

.
│
└─── src/
|     └─── <nombre_archivo_final>.l   # Archivo flex
|     └─── <nombre_archivo_final>.y   # Archivo bison (si corresponde)
|     └─── ...                        # Código C (archivos *.c y *.h)
└─── makefile                         # Archivo makefile para compilar el proyecto

Al compilar, se generará lo siguiente:

.
│
└── bin/
|    └─── <nombre_archivo_final>.exe/.out # Archivo ejecutable generado por gcc
└── obj/
     └─── <nombre_archivo_final>.yy.c     # Código C generado por flex
     └─── <nombre_archivo_final>.tab.c    # Código C generado por bison (si corresponde)
     └─── <nombre_archivo_final>.tab.h    # Encabezado C generado por bison (si corresponde)
     └─── <nombre_archivo_final>.output   # Gramática generada por bison (si corresponde)
     └─── ...                             # Código máquina generado por gcc (archivos *.o)

¿Cómo configuro VSCode?

Consola

Para que los makefiles funcionen, es fundamental usarlos siempre en una consola Bash. Para configurarla por default en VSCode se deberá hacer lo siguiente:

bash vsc

Plugins

Para resaltar la sintaxis de Flex y Bison, recomiendo usar el plugin Yash:

image

¿Cómo se usa?

Para ejecutar los makefiles, nos moveremos a la ruta donde se encuentra nuestro archivo makefile y usaremos el comando make seguido de alguna de las reglas existentes de ser necesario. Si querés ver cómo funciona el makefile, podés hacerlo en la wiki de este repo.

Compilar el proyecto

$ make

Eliminar los archivos generados al compilar

$ make clean

Esto es útil por si uno quiere compilar todo el proyecto desde cero. Si tu intención es eliminar los objetos generados del repo, te aconsejo usar un archivo gitignore.

Debugear el proyecto

$ make debug

Aclaración importante

En el caso de Bison, para debugear el proyecto hay que tener dentro del main(), antes de yyparse(), las siguientes tres líneas:

    #if YYDEBUG
        yydebug = 1;
    #endif

Para más información sobre cómo funciona esta regla, podés ver la sección sobre make debug en la wiki de este repo.

Consejo

El ejecutable generado va a imprimir por la salida estándar las reglas por las que va derivando:

Starting parse
Entering state 0
Reducing stack by rule 1 (line 29):
-> $$ = nterm input ()
Stack now 0
Entering state 1
Reading a token: --(end of buffer or a NUL)

Probablemente, a medida que el proyecto vaya escalando, leer eso desde la consola te resulte poco práctico, así que una forma rápida en Bash de redirigir stdout a un archivo de log sin modificar código es la siguiente:

$ ./main.out &> main.log

Esto me genera un archivo main.log que puede ser abierto por cualquier editor de texto. En VSCode, incluso se puede abrir durante la ejecución y seguirlo en tiempo real como si fuera el stdout.

Troubleshooting

¿Cómo incluyo una library?

Al principio del makefile hay un comentario que lo explica muy simple:

# Agregar bibliotecas necesarias acá (por ejemplo, -lm para incluir <math.h>)
LIBS+=-lfl

Entonces, si queremos incluir una biblioteca como math, simplemente concatenamos ahí el flag correspondiente.

Make: Nothing to be done for 'all'.

make: Nothing to be done for 'all'.

¡No es un error! Significa que los archivos en src/ no fueron modificados desde la última vez que se compiló el proyecto. Asegurate de haber guardado los últimos cambios antes de compilar ;)

Makefile: missing separator. Stop.

makefile:35: *** missing separator.  Stop.

Esto se debe a que el make es sensible a los tabs. Probablemente habrás copiado el texto del makefile, y lo habrás pegado en un bloc de notas o en el VSCode, y el editor incluyó espacios en vez de tabs con \t.

En VSCode esto se puede resolver de esta forma.

No puedo ejecutar 'make' más de una vez / 'make clean' no elimina los archivos correctamente

Probablemente, si estás en Windows y al ejecutar make se crea una subcarpeta -p, además de aparecer errores del estilo:

Ya existe el subdirectorio o el archivo -p.
Error mientras se procesaba: -p.
Ya existe el subdirectorio o el archivo obj.
Error mientras se procesaba: obj.
make: *** [Ejemplo.exe] Error 1

y al ejecutar make clean también puede que te aparezca algo como:

process_begin: CreateProcess(NULL, uname, ...) failed.
rm -f obj/*
process_begin: CreateProcess(NULL, rm -f obj/*, ...) failed.
make (e=2): El sistema no puede encontrar el archivo especificado.
make: *** [clean] Error 2

Es porque estás usando la consola cmd o Powershell. Asegurate de cambiarla a Bash como se explica más arriba.

Footnotes

  1. Esto permite que GCC encuentre las bibliotecas de Flex y Bison, más info en: https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html

ssl-flex-bison-projects's People

Contributors

raniagus avatar

Watchers

 avatar

Forkers

julianbuffoni

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.