title: BISON
text: # BISON
  
  YACC/BISON es un proyecto creado por GNU y es un programa que genera analizadores sintácticos con propósitos generales. Este está disponible para cualquier sistema operativo y se usa acompañado de Flex.
  
  # BISON
  ## Características
  
  Entre sus características convierte la descripción de un lenguaje, escrita con una gramática libre LALR, en un programa en C, C++ que sirve para la creación de un análizador sintáctico o parser. Para la utilización de Bison, es necesaria tener la gramática a analizar.
  Características
  Bison es la versión GNU de Yacc.
  * Es totalmente compatible con Yacc.
  * Mejora algunas de las prestaciones de Yacc.
  * Habitualmente Yacc/Bison se utiliza conjuntamente con Lex/Flex.
  * Lex/Flex genera un analizador léxico: yylex
  * Yacc/Bison genera un analizador sintáctico: yyparse
  
  # BISON
  ## Elementos del archivo
  
  El archivo de codificación de Yacc/Bison tiene cuatro secciones:
  Declaraciones C
  Declaraciones Yacc/Bison
  %Declaración de Token
  Reglas de la gramática
  Código C
  Las cadenas “%{“, “%}” sirve para delimita el encabezado que pudieran ser bibliotecas
  “%%” sirven para indicar cuales son las reglas
  Y por último va programación en C o llamadas a funciones en caso de ser necesario.
  %Token Se utiliza para definir los símbolos no terminales (tokens) de la gramática.
  %token NOMBRE_TOKEN
  Por convenio, los nombres de los tokens se ponen en mayúsculas y se pueden agrupar varios token en una línea si tienen en mismo tipo.
  
  # BISON
  ## Ejemplos
  
  El siguiente contenido vendría en un archivo nombre.y
  #include <stdio.h>
  /* Declaraciones de BISON */
  %token ARTICULO
  %token SUJETO
  %token VERBO
  cadena: ARTICULO SUJETO VERBO;
  int main {
  yyerror (char *s)
  int yywrap
  Al compilarse el archivo de Bison se generan dos archivos, un archivo .h y otro .c. El archivo .h (biblioteca) debe incluirse en el archivo de Lex.
  Donde los token ARTICULO SUJETO VERBO están dentro del archivo de Lex que para este ejemplo corresponde al archivo extensión .l:
  /* Archivo en lex */
  #include "reglas.tab.h"
  El|lo|la|los|las {return ARTICULO;}
  perro|perros|carro|carros|nino|ninos {return SUJETO;}
  come|comen|corre|corren|juega|juegan {return VERBO;}
  En linux se compilar ambos con GCC y como resultado da un ejecutable que es nuestro parser.