Escolar Documentos
Profissional Documentos
Cultura Documentos
INTRODUCCIN AL USO DE
FLEX BISON
PARA LA RESOLUCIN DE TAREA ESPECIAL
Sintaxis y Semntica de Lenguajes
Dpto. de Ing. en Sistemas
NDICE
1.
INTRODUCCIN ......................................................................................................... 3
2.
EL PROBLEMA ........................................................................................................... 4
3.
FLEX ............................................................................................................................ 5
3.1
Qu es Flex?.......................................................................................................................5
3.2
Cmo se estructura un programa Flex? .....................................................................6
3.2.1
Definiciones .....................................................................................................................6
3.2.2
Reglas ...............................................................................................................................8
3.2.3
Cdigo de Usuario ............................................................................................................9
3.3
4.
4.1
4.2
Cmo se estructura un programa BISON? ..............................................................12
4.2.1
Declaraciones .................................................................................................................12
4.2.2
Reglas de Produccin de la Gramtica ...........................................................................14
4.2.3
Cdigo C adicional .........................................................................................................17
4.3
5.
6.
7.
1. INTRODUCCIN
2. EL PROBLEMA
Herramientas
En adelante y de modo simblico, nos referiremos a este lenguaje particular como Lenguaje XX.
3. FLEX
3.1 QU ES FLEX?
COMPILADOR FLEX
CODIGO FUENTE EN C - lex.yy.c
(Programa que implementa el reconocimiento de cadenas y ejecuta
acciones en consecuencia)
COMPILADOR C (gcc)
Cdigo Fuente
Lenguaje XX
PROGRAMA EJECUTABLE
(SCANNER)
Resultados del
Anlisis
Figura 1
% {declaraciones en C %}
definiciones
%%
reglas
%%
cdigo de usuario
Figura 2
3.2.1 Definiciones
La seccin de Definiciones est constituida por una secuencia de parejas de la
forma nombre-definicin, conocidas como definiciones de nombre.
%%
nombre definicin
nombre definicin...
Definiciones de nombre
Pareja: nombre-definicin
donde:
nombre: nombre del token
definicin: expresin regular (patrn)
Figura 3
Luego, cada vez que se haga referencia al token utilizando {nombre}, la definicin se
expandir a su expresin regular asociada.
Ejemplo:
DIGITO
[0-9]
ID
[a-z][a-z0-9]*
CARACTER
(\\[^\n]|[^"\\\n])
%%
Dadas estas definiciones de nombre, nuestro Scanner asociar cualquier nmero
dgito (0,1,2,,9) al token DIGITO, cualquier secuencia de una letra seguida cero o
ms letras o dgitos al token ID, y cualquier carcter ASCII empatar con el token
CARCTER.
El nombre es un identificador que puede comenzar con una letra o guin bajo,
seguido por cero o ms letras, dgitos, _, o - (guin).
La definicin comienza en el primer carcter que no sea un espacio en blanco
siguiendo al nombre y continuando hasta el final de la lnea. La sintaxis para escribir
expresiones regulares en Flex puede consultarse en la seccin 07. Patterns de Vern
Paxon (1995) Flex 2.5. Universidad de California2.
3.2.2 Reglas
La seccin de Reglas contiene una serie de declaraciones de la forma: patrnaccin donde el patrn debe estar sin sangrar y la accin debe comenzar en la misma
lnea.
%%
patrn1 {accin1}
patrn2 {accin2}
...
donde:
patrn: expresin regular
accin: cdigo C con las acciones a ejecutar cuando se encuentra
concordancia del patrn con el texto de entrada.
Figura 4
Ejemplo
%%
{DIGITO}+
\"{CARACTER}*\"
Para ms informacin sobre la forma de describir las reglas patrn-accin Ver las
secciones 0.8 How the input is matched y 09. Actions de: Vern Paxon (1995) Flex 2.5.
Universidad de California.
%{
#include <stdio.h>
#include "instrucciones.tab.h"
%}
separador ([ \t])+
letra
digito
[a-zA-Z]
[0-9]
identificador {letra}({letra}|{digito})*
constEntera {digito}({digito})*
%%
Sintaxis y Semntica de Lenguajes: resolucin problemas de ingeniera
{return (OPAS);}
"+"
{return (MAS);}
{return (APAR);}
")"
{return (CPAR);}
\n
{return (NL);}
ECHO;
%%
10
4. BISON
4.1 QU ES BISON?
COMPILADOR BISON
COMPILADOR C (gcc)
Cdigo Fuente
Lenguaje XX
PROGRAMA EJECUTABLE
(PARSER)
Resultados del
Anlisis
Figura 5
11
% {declaraciones en C %}
Declaraciones Bison
%%
Reglas de produccin de la gramtica
%%
Cdigo C adicional
Figura 6
4.2.1 Declaraciones
Las declaraciones en C pueden definir tipos y variables utilizadas luego en las
acciones3. Pueden tambin incluir comandos del preprocesador, tales como la directiva
de inclusin #include para incluir archivos de cabecera que realicen cualquiera de estas
cosas.
3
En general, cuando la presente gua utiliza el trmino acciones, referencia al cdigo C que deber ejecutarse como accin semntica vinculada
al reconocimiento de un Token (en Flex) o de una categora sintctica (en Bison).
12
Ejemplo
%{
#define YYSTYPE int
#include <math.h>
char *cadena;
int errores = 0;
%}
Las declaraciones de Bison enuncian los nombres de los smbolos terminales y no
terminales de la gramtica. Tambin se puede describir aqu la precedencia de
operadores y los tipos de datos de algunos smbolos (Valores Semnticos).
Todos los nombres de tokens se deben declarar. Los smbolos no terminales deben
ser declarados si necesita especificar el tipo de dato a utilizar para los valores
semnticos.
13
Ejemplo
%%
/* Declaraciones de BISON */
%token ENTERO -> token declarado
%token DIGITO
%token INICIO_PROGRAMA
%token FIN_PROGRAMA
%left '-' '+
14
resultado: componentes-regla1
{sentencias en C}
| componentes-regla2 {sentencias en C}
...
;
donde:
resultado: no terminal a la izquierda de la produccin.
componentes-regla: secuencia de terminales y no terminales que
definen una regla.
sentencias en C: acciones que se ejecutan cuando hay correspondencia
con una regla (Es opcional usarlo Asignan valor semntico a la regla).
Figura 8
Ejemplo
%%
/* Gramtica */
programa: INICIO_PROGRAMA exps FIN_PROGRAMA
exps: exp exps
| exp
;
exp: ENTERO
{ $$ = $1;}
{ $$ = $1 + $2;}
{ $$ = $1 - $2;}
{ $$ = $1 * $2;}
{ $$ = $1 / $2; }
15
;
En este ejemplo, el axioma de la gramtica es el no terminal programa. Un
programa se define como un conjunto de expresiones agrupadas entre los tokens
INICIO_PROGRAMA y FIN_PROGRAMA. Se debe tener presente que estos tokens
debern ser previamente reconocidos por el Analizador Lxico y proporcionados al
Parser. Un conjunto de expresiones (exps), se define luego mediante una regla
recursiva a derecha como una expresin (exp) seguida de un conjunto de expresiones
(exps) simplemente como una expresin (exp). Finalmente se define una expresin
(exp) como un ENTERO como una expresin binaria de suma, resta, producto o
cociente en notacin postfija. De esta forma, el ejemplo define la gramtica de un
lenguaje de expresiones algebraicas en notacin postfija (o polaca inversa).
Asociado a cada derivacin de exp, se enuncia una accin (cdigo en C) que define
la semntica asociada a dicha produccin. Es decir, la accin que debe ejecutarse
cuando el Parser utiliza dicha produccin en el reconocimiento de una entrada.
La variable $$ guarda el valor asociado al no terminal que se est definiendo. La
variable $1 guarda el valor asociado al primer componente del lado derecho de la
produccin, la variable $2 guarda el valor asociado al segundo componente del lado
derecho y as sucesivamente. Se debe recordar que Bison genera un Parser LALR(1)
que construye el rbol de anlisis sintctico desde las hojas hacia la raz (Bottom-Up)
mediante operaciones de desplazamiento-reduccin (Shift-Reduce).
As, en nuestro ejemplo, para la entrada 5 + 3, las derivaciones seran:
16
Figura 9
17
La funcin yyparse()
El cdigo fuente Bison se convierte, al compilarlo, en una funcin en C llamada
yyparse. Esta funcin, implementa el Analizador; es decir: lee tokens, ejecuta acciones,
y por ltimo retorna cuando se complet el anlisis del cdigo fuente en Lenguaje XX o
cuando se encontr un Error de tipo sintctico del que no puede recuperarse. El valor
devuelto por yyparse es 0 si el anlisis tuvo xito 1 si el anlisis fall.
La funcin yyerror()
Esta funcin es llamada por yyparse() cuando se detecta un error de sintaxis. Si se
define esta funcin, se esta definiendo qu acciones debe ejecutar el Parser cuando se
produce un error sintctico.
Ejemplo
%%
int main(char** argv) {
yyin = fopen(argv[0],"rt");
yyparse();
}
yyerror (char *s) {
printf ("%s\n", s);
++errores;
}
int yywrap() { return 1; }
18
%{
#include <stdio.h>
%}
%token IDENTIFICADOR OPAS CONSTENTERA NL MAS APAR CPAR
%start instrucciones
%%
instrucciones : instrucciones instruccion
| instruccion
;
instruccion : IDENTIFICADOR OPAS expresion NL
;
expresion : termino
| expresion MAS termino
;
termino : IDENTIFICADOR
| CONSTENTERA
| APAR expresion CPAR
;
%%
int yyerror (char *s) {
printf ("%s\n", s);
}
main()
{
yyparse();
}
19
Ejemplo Completo
#include "y.tab.h"
%}
separador ([ \t])+
letra [a-zA-Z]
digito
[0-9]
identificador {letra}({letra}|{digito})*
constEntera {digito}({digito})*
%%
{separador} {/* omitir */}
/*se indica al Parser el reconocimiento de cada token*/
20
#include <stdio.h>
%}
/* Se declaran los tokens que reconocer el Scanner*/
%start instrucciones
%%
main()
{
/* Acciones a ejecutar antes del anlisis */
yyparse();
21
En esta seccin se enuncian brevemente los pasos a seguir para instalar Flex y
Bison en nuestra computadora.
22
Una vez instaladas las herramientas y escrito el cdigo fuente del Scanner en Flex y el
Parser en Bison para el Lenguaje XX, se deber compilar de acuerdo a los siguientes
pasos:
bison d fuente.y
2. Compilar el cdigo fuente Flex
flex fuente.l
3. Compilar el cdigo C generado para obtener el ejecutable
23