¿Qué es Bison?
GNU bison es un programa generador de analizadores sintácticos de propósito general perteneciente al proyecto GNU disponible para prácticamente todos los sistemas operativos, se usa normalmente acompañado de flex aunque los analizadores léxicos se pueden también obtener de otras formas.
Bison convierte la descripción formal de un lenguaje, escrita como una gramática libre de contexto LALR, en un programa en C, C++, o Java que realiza análisis sintáctico. Es utilizado para crear analizadores para muchos lenguajes, desde simples calculadoras hasta lenguajes complejos. Para utilizar Bison, es necesaria experiencia con el la sintaxis usada para describir gramáticas.
GNU bison tiene compatibilidad con Yacc, todas las gramáticas bien escritas para Yacc, funcionan en Bison sin necesidad de ser modificadas. Cualquier persona que esté familiarizada con Yacc podría utilizar Bison sin problemas.
Bison fue escrito en un principio por Robert Corbett; Richard Stallman lo hizo compatible con Yacc y Wilfred Hansen de la Carnegie Mellon University añadió soporte para literales multicaracter y otras características.
Palabras claves: Bison, Flex, analizador sintáctico, analizador semántico, parser, scanner
Desarrollo
Al Bison, se le entra un fichero con extensión ".y" que contiene la especificación de una gramática y genera una función en C++ que reconoce cadenas validas de esa gramática.
El fichero para la especificación de la gramática contiene 4 partes, dividas por los delimitadores como se muestra a continuación.
%{
Prologo
%}
Declaraciones del Bison
%%
Reglas de la gramática
%%
Epilogo
Prologo
Se realizan las definiciones de las macros, las declaraciones de las funciones y las declaraciones de las variables que van a ser utilizadas posteriormente.
Ejemplo de Macros definidas en esta sección es la que se utiliza para especificar el tipo de datos con que se va a trabajar, se define la directiva: #difine YYSTYPE tipo, si no se especifica, el tipo que toma por defecto es int.
Declaraciones del Bison
Se declaran los símbolos terminales y no terminales que hagan falta, se definen la prioridad de los operadores, etc.
NOTA: Las dos primeras secciones son opcionales.
Reglas de la gramática
En esta parte se definen las reglas de la gramática, al menos debe de existir una, y siempre después del delimitador %% el cual es obligatorio (aunque sea la primera sección que aparezca en el fichero).
Epilogo
Se definen funciones en C++ que van a ser copiadas exactamente a como se definan al final del fichero generado por Bison, de la misma forma que las declaraciones del prologo son copiadas al inicio del mismo fichero generado por el Bison.
Nota: Esta sección también es opcional.
Símbolos terminales y no terminales
En Bison se declaran los Token, que serian los no terminales de la gramática. Hay tres formas de declarar Tokens.
1. %token
2. Un carácter entre comillas simples, este no es necesario declararlo, se puede utilizar directamente en la gramática y se reconoce como Token, si se desea darle algún valor semántica, entonces si se tendría que declarar.
3. %left o %right para definir la asociatividad de los operadores.
La Sintaxis de las reglas de la Gramática
<No Terminal>: <conjunto de terminales y no terminales>;
Lo que se encuentra en la parte izquierda de ":" es el no Terminal que comienza la regla, lo que está a la derecha lo que genera esa regla y el ";" es lo que define el final de la producción.
Para asociarle una semántica a una determinada regla se pone un código en C++ entre llaves.
Para poner múltiples reglas asociadas con un no Terminal se utiliza "|" para obtener la separación.
Ejemplo:
exp: NUM {$$ = $1;}
| exp '+' exp {$$ = $1 + $3;}
| exp '-' exp {$$ = $1 – $3;}
| exp '*' exp {$$ = $1 * $3;}
| exp '/' exp {$$ = $1 / $3;}
| '(' exp ')' {$$ = $2;}
;
Página siguiente |