0% encontró este documento útil (0 votos)
73 vistas34 páginas

Calculadora 03 04 Web

Este documento describe los pasos para construir una calculadora simple utilizando las herramientas Lex/Flex y Yacc/Bison. Incluye la descripción de la calculadora, las reglas de la gramática, especificaciones de tokens y valores, y detalles sobre cómo trabajan conjuntamente Lex/Flex y Yacc/Bison para analizar la entrada y reconocer la gramática.

Cargado por

Michael Morales
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
73 vistas34 páginas

Calculadora 03 04 Web

Este documento describe los pasos para construir una calculadora simple utilizando las herramientas Lex/Flex y Yacc/Bison. Incluye la descripción de la calculadora, las reglas de la gramática, especificaciones de tokens y valores, y detalles sobre cómo trabajan conjuntamente Lex/Flex y Yacc/Bison para analizar la entrada y reconocer la gramática.

Cargado por

Michael Morales
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 34

Prcticas de compiladores 2003-2004

1
Construccin de una calculadora con Lex/Flex y Yacc/Bison
Descripcin de la calculadora
Reglas de la gramtica
Los tokens y sus expresiones regulares para Lex/Flex
Cmo trabajan Lex/Flex y Yacc/Bison
Breve descripcin del fichero de especificacin de Yacc/Bison
Especificaciones para Lex/Flex y Yacc/Bison
Definicin de los tokens cuando se trabaja slo con Lex/Flex
Definicin de los tokens cuando se trabaja con Lex/Flex y Yacc/Bison
Acceso a la definicin de los tokens desde Lex/Flex
Especificacin para Lex/Flex
Incorporacin de las reglas de la gramtica
Especificacin del axioma de la gramtica y caractersticas de los operadores
Incorporacin de la funciones yyerror() y main()
Creacin del ejecutable
Primera prueba de la calculadora
Entradas correctas
Entradas incorectas
ndice (i)
Marina de la Cruz
Alfonso Ortega
Prcticas de compiladores 2003-2004
2
Construccin de una calculadora con Lex/Flex y Yacc/Bison
Funcionamiento de la funcin yyparse()
Funcionamiento bsico
Los valores de los smbolos
Incorporacin de funcionalidad a la calculadora
Anlisis de la entrada 8 + 9 \n
La propagacin de atributos vista sobre el rbol de anlisis
ndice (ii)
Marina de la Cruz
Alfonso Ortega
Prcticas de compiladores 2003-2004
3
Descripcin de la calculadora
El objetivo es construir una calculadora utilizando las herramientas Lex/Flex y
Yacc/Bison que cumpla las siguientes especificaciones.
La calculadora tiene un funcionamiento similar al de un intrprete, cuando recibe
como entrada una expresin matemtica sencilla como por ejemplo 6 + 3, calcula
el resultado de la operacin y lo muestra por pantalla.
Los tipos de datos que puede manipular la calculadora son entero y real.
El formato de los nmeros enteros es el habitual, es decir, un nmero entero es una
secuencia de uno o ms dgitos del 0 al 9.
El formato de los nmeros reales consiste en un parte entera formada por una
secuencia de cero o ms dgitos del 0 al 9, a continuacin un punto, y seguidamente la
parte fraccionaria formada por una secuencia de uno o ms dgitos del 0 al 9.
Las operaciones disponibles son: suma, resta, multiplicacin y divisin para el tipo
de datos real, y suma, resta y multiplicacin para el tipo de datos entero. No est
permitida ninguna operacin aritmtica con operandos de tipos diferentes.
Todas las operaciones se pueden agrupar con parntesis.
Una expresin termina con un salto de lnea.
El usuario puede introducir espacios en blanco y tabuladores, y todos sern
ignorados. Las lneas vacas no estn permitidas (una lnea en blanco es un error
sintctico).
Prcticas de compiladores 2003-2004
4
Reglas de la gramtica
El lenguaje que entiende la calculadora es el que genera la siguiente gramtica
(excluyendo las reglas que describen las constantes enteras y las reales.):
1: <lineas> ::= <linea> \n
2: | <lineas> <linea> \n
3: <linea> ::= <exp real>
4: | <exp entera>
5: <exp entera> ::= entero
6: | <exp entera> + <exp entera>
7: | <exp entera> - <exp entera>
8: | <exp entera> * <exp entera>
9: | ( <exp entera> )
10: <exp real> ::= real
11: | <exp real > + <exp real >
12: | <exp real > - <exp real >
13: | <exp real > * <exp real >
14: | <exp real > / <exp real >
15: | ( <exp real > )
Prcticas de compiladores 2003-2004
6
Cmo trabajan Lex/Flex y Yacc/Bison (I)
Lex/Flex y Yacc/Bison
Lex/Flex reconoce expresiones regulares, y Yacc/Bison reconoce gramticas
independientes del contexto.
Lex/Flex divide el programa fuente en tokens y Yacc/Bison agrupa esos tokens.
Es habitual utilizar Lex/Flex y Yacc/Bison conjuntamente para desarrollar un compilador.
Con Lex/Flex se construye el analizador morfolgico y con Yacc/Bison el sintctico.
Yacc/Bison construye a partir de la gramtica especificada por el usuario un
analizador sintctico que reconoce entradas vlidas para dicha gramtica, es decir,
reconoce entradas sintcticamente vlidas.
Yacc/Bison
Entrada vlida/no vlida
sintcticamente
Entrada
(tokens)
Especificacin
de la gramtica
Analizador
sintctico
Prcticas de compiladores 2003-2004
7
Cmo trabajan Lex/Flex y Yacc/Bison (II)
Lex/Flex Yacc/Bison
Leer
caracteres
Fichero
de
entrada
*.l *.y
Especificacin
Lex/Flex
Especificacin
Yacc/Bison
lex.yy.c
y.tab.c
yylex( ) yyparse( )
Solicitud del siguiente
token
yylval
Valor del
token
N del token,
0 si es EOF
Uso del valor del token en las
acciones de las reglas
VEP DESCPIPCIM
DEL DIA0PAMA EM LA
PA0IMA SI0UIEMTE
Solicitud del siguiente
token
yylval
Valor del
token
N del token,
0 si es EOF
Uso del valor del token en las
acciones de las reglas
Prcticas de compiladores 2003-2004
8
Cmo trabajan Lex/Flex y Yacc/Bison (III)
Lex/Flex construye la funcin yylex() de anlisis morfolgico a partir del
fichero de especificacin correspondiente. La funcin yylex() lee el fichero
de entrada e identifica los tokens.
Yacc/Bison construye la funcin yyparse() de anlisis sintctico a partir del
fichero de especificacin correspondiente. La funcin yyparse() solicita a la
funcin yylex() los tokens de la entrada y comprueba si forman una
construccin vlida de acuerdo a las reglas de la gramtica descritas en el
fichero de especificacin.
Cada vez que la funcin yylex() devuelve un token al analizador sintctico, si
el token tiene un valor asociado, yylex() guarda ese valor en la variable
yylval antes de terminar. Por ejemplo, un identificador de una variable,
adems de tener un nmero de token que lo identifica y distingue de otros tipos
de tokens, tambin tiene asociado como valor o atributo, el lexema del
identificador. Sin embargo, un parntesis no tiene asociado ningn valor o
atributo. Posteriormente se estudiar cmo la funcin yyparse() utiliza los
valores asociados a los tokens y cmo definir el tipo de la variable yylval (por
defecto es de tipo int).
Prcticas de compiladores 2003-2004
9
Breve descripcin del fichero de especificacin de Yacc/Bison (I)
El fichero de especificacin de Yacc/Bison tiene una estructura similar al fichero
de especificacin de Lex/Flex. Se compone de tres secciones separadas por
lneas que contienen el separador %%.
seccin de definiciones
%{
/* delimitadores de cdigo C */
%}
%%
seccin de reglas
%%
seccin de funciones de usuario
Prcticas de compiladores 2003-2004
10
Breve descripcin del fichero de especificacin de Yacc/Bison (II)
Seccin de definiciones: contiene,
La definicin de los tokens.
La definicin de los diferentes tipos de los tokens.
El axioma de la gramtica.
La precedencia y asociatividad de los operadores.
Cdigo C que se copia literalmente en el fichero de salida y que normalmente
contiene declaraciones de variables y funciones que se utilizan en la seccion de
reglas. El cdigo C va encerrado entre lneas con los caracteres %{ y %}.
Seccin de reglas: contiene las reglas de la gramtica en un formato concreto.
Seccin de funciones de usuario: contiene,
Funciones escritas por el usuario para ser utilizadas en la seccin de reglas, es decir,
funciones de soporte.
Se copia literalmente en el fichero de salida.
En aplicaciones grandes, es ms conveniente agrupar todas las funciones de soporte
en un fichero o conjunto de ficheros, en lugar de incluirlas en esta seccin.
Prcticas de compiladores 2003-2004
11
Especificaciones para Lex/Flex y Yacc/Bison (I)
#ifndef _TOKENS_H
#define _TOKENS_H
#define TOK_REAL 1
#define TOK_ENTERO 2
#define TOK_MAS 3
#define TOK_MENOS 4
#define TOK_POR 5
#define TOK_DIV 6
#define TOK_PARIZQ 7
#define TOK_PARDER 8
#define TOK_SALTO 9
#define TOK_ERROR -1
#endif
tokens.h
Se escribe un fichero de cabecera,
por ejemplo, tokens.h con la
definicin de los tokens y se incluye
ese fichero en el fichero de
especificacin de Lex/Flex.
Tambin se debe incluir el fichero
tokens.h en cualquier fichero que
contenga llamadas a la funcin de
anlisis morfolgico yylex(), ya
que dicha funcin devuelve como
valor de retorno los tokens
definidos en el fichero de cabecera.
Definicin de los tokens cuando se trabaja slo con Lex/Flex
Prcticas de compiladores 2003-2004
12
Especificaciones para Lex/Flex y Yacc/Bison (II)
Definicin de los tokens cuando se trabaja con Lex/Flex y Yacc/Bison
%{
...
%}
%union
{
double real;
int entero;
}
%token <real> TOK_REAL
%token <entero> TOK_ENTERO
%%
...
%%
...
calc.y
Definicin de tokens:
Se definen los tokens utilizando la declaracin
%token en la seccin de definiciones del fichero
de especificacin de Yacc/Bison.
Los tokens de un slo carcter no es necesario
definirlos, ya estn predefinidos en Yacc/Bison,
por lo tanto, para la calculadora slo se definen
los tokens TOK_REAL y TOK_ENTERO.
Definicin de los tipos de valores de los tokens:
Se definen los distintos tipos de los valores de
los tokens con la declaracin %union en la
seccin de definiciones. A partir de esta
declaracin Yacc/Bison crea una definicin C de
tipo union y de nombre YYSTYPE. Tambin
define la variable yylval de ese tipo.
Se aade a cada declaracin %token el campo
del tipo union correspondiente al valor del token
entre parntesis triangulares y entre %token y el
nombre del token como se indica en la figura.
Prcticas de compiladores 2003-2004
13
Especificaciones para Lex/Flex y Yacc/Bison (III)
Acceso a la definicin de los tokens desde Lex/Flex
Se compila con Yacc/Bison el fichero calc.y con la opcin -d para que se genere
el fichero y.tab.h que contiene la definicin de los tokens y sus tipos.
En el fichero de especificacin de Lex/Flex se incluye el fichero y.tab.h .
Yacc/Bison
-d
calc.y
%{
...
%}
%union
{
double real;
int entero;
}
%token <real> TOK_REAL
%token <entero> TOK_ENTERO
%%
...
%%
...
#ifndef BISON_Y_TAB_H
#define BISON_Y_TAB_H
typedef union
{
double real;
int entero;
}YYSTYPE;
extern YYSTYPE yylval;
#define TOK_REAL 257
#define TOK_ENTERO 258
#endif
y.tab.h
%{
#include y.tab.h
..........................
calc.l
Prcticas de compiladores 2003-2004
14
calc.y
%{
...
%}
%union
{
double real;
int entero;
}
%token <real> TOK_REAL
%token <entero> TOK_ENTERO
%%
...
%%
...
Especificaciones para Lex/Flex y Yacc/Bison (IV)
Especificacin para Lex/Flex (i)
#ifndef BISON_Y_TAB_H
#define BISON_Y_TAB_H
typedef union
{
double real;
int entero;
}YYSTYPE;
extern YYSTYPE yylval;
#define TOK_REAL 257
#define TOK_ENTERO 258
#endif
y.tab.h
lex.yy.c
y.tab.c
yylex( ) yyparse( )
yylval
real
entero
11.87
entrada
...............
{real} { yylval.real = atof(yytext);
return TOK_REAL; }
...............
calc.l
11.87
...............
{real} { yylval.real = atof(yytext);
return TOK_REAL; }
...............
257
11.87
...............
{real} { yylval.real = atof(yytext);
return TOK_REAL; }
...............
Prcticas de compiladores 2003-2004
16
Especificaciones para Lex/Flex y Yacc/Bison (VI)
%{
...
%}
%union
{
double real;
int entero;
}
%token <real> TOK_REAL
%token <entero> TOK_ENTERO
%%
lineas: linea \n
|lineas linea \n
;
linea: exp_real
|exp_entera
;
(contina ...)
calc.y
Incorporacin de las reglas de la gramtica (i)
La seccin de reglas dentro del fichero de
especificacin de Yacc/Bison es una lista
de todas las reglas de la gramtica, con un
formato determinado.
El formato de cada regla es muy similar a
la notacion BNF, con pocas diferencias: se
separa la parte izquierda de la derecha con
el carcter dos puntos, y cada regla se
termina con un punto y coma.
Prcticas de compiladores 2003-2004
17
Especificaciones para Lex/Flex y Yacc/Bison (VII)
(... continuacin)
exp_entera: TOK_ENTERO
|exp_entera + exp_entera
|exp_entera - exp_entera
|exp_entera * exp_entera
|( exp_entera )
;
exp_real: TOK_REAL
|exp_real + exp_real
|exp_real - exp_real
|exp_real * exp_real
|exp_real / exp_real
|( exp_real )
;
%%
...............
Incorporacin de las reglas de la gramtica (ii)
calc.y
Prcticas de compiladores 2003-2004
18
Especificaciones para Lex/Flex y Yacc/Bison (VIII)
%{
...
%}
%union
{
double real;
int entero;
}
%token <real> TOK_REAL
%token <entero> TOK_ENTERO
%start lineas
%left + -
%left * /
%%
...
%%
calc.y
Especificacin del axioma de la gramtica y caractersticas de los operadores
Axioma de la gramtica
Yacc/Bison permite especificar el axioma
de la gramtica con la declaracin de la
forma:
%start axioma
Si se omite la declaracin, se asume que el
axioma de la gramtica es el primer no
terminal de la seccin de reglas de la
gramtica.
Caractersticas de los operadores
Se puede definir la asociatividad de los
operadores con las declaracines %left o
%right.
La precedencia de los operadores se
determina por el orden de aparicin de las
declaraciones, los operadores que
aparecen primero tienen menor
precedencia.
Prcticas de compiladores 2003-2004
19
Especificaciones para Lex/Flex y Yacc/Bison (IX)
Incorporacin de la funciones yyerror() y main() (i)
Funcin yyerror()
Cuando Yacc/Bison detecta un error sintctico, es decir, recibe un token que no
espera, invoca a la funcin yyerror(). Esta funcin tiene que ser proporcionada por
el usuario, se puede incorporar en la ltima seccin del fichero de especificacin
calc.y (en Linux se puede no proporcionar ya que la proporciona la librera de
Yacc/Bison).
El prototipo de la funcin es:
void yyerror(char* s)
El nico parmetro de la funcin es el mensaje del error sintctico ocurrido.
La versin mnima de esta funcin muestra por pantalla el mensaje que recibe como
parmetro.
Funcin main()
La rutina de anlisis sintctico yyparse() tiene que ser invocada. Para realizar
pruebas, se puede incorporar una funcin main() en la seccin de funciones de
usuario del fichero de especificacin calc.y (en Linux se puede no proporcionar ya
que la proporciona la librera de Yacc/Bison). Cuando se construya el compilador
completo, se eliminar esta funcin main() y se invocar a la rutina de anlisis
sintctico yyparse() desde fuera del fichero de especificacin calc.y.
Prcticas de compiladores 2003-2004
20
Especificaciones para Lex/Flex y Yacc/Bison (X)
%%
int main()
{
return(yyparse());
}
void yyerror(char* s)
{
fprintf(stderr,%s\n,s);
}
calc.y
Incorporacin de la funciones yyerror() y main() (ii)
No olvidar incluir en la primera seccin del fichero
calc.y la directiva #include
<stdio.h>
En windows tambin hay que incluir en la primera
seccin el prototipo de la funcin yyerror().
Prcticas de compiladores 2003-2004
21
Creacin del ejecutable
Con el contenido actual de los ficheros de especificacin calc.l y calc.y se puede
realizar una primera prueba de la calculadora. De momento, la calculadora no realiza
las operaciones, pero s se puede verificar que el anlisis lxico funciona
correctamente y tambin el anlisis sintctico.
Para crear el ejecutable:
Compilar la especificacin Lex/Flex:
flex calc.l se crea el fichero lex.yy.c
Compilar la especificacin Yacc/Bison:
yacc -d calc.y se crean los ficheros y.tab.h, y.tab.c
o bien, bison -d -y calc.y se crean los ficheros y.tab.h, y.tab.c
Generar el ejecutable:
Linux: gcc -Wall -o calc lex.yy.c y.tab.c se crea el fichero calc
Windows: cl /W4 /Fecalc.exe lex.yy.c y.tab.c se crea el fichero calc.exe
Prcticas de compiladores 2003-2004
22
Primera prueba de la calculadora (I)
Arrancar la calculadora y:
probar las siguientes expresiones morfolgica y sintcticamente correctas.
Terminar cada expresin con un salto de lnea.
Terminar las pruebas con el carcter de finalizacin del fichero de entrada (segn el
sistema operativo).
Entradas correctas
Expresiones constantes
12
3.7
.9
Expresiones enteras
4+4
9-5
7*3
(4+5) * (9-6)
Expresiones reales
9.4 + 7.2
10.8 - 2.0
.9 * 2.3
90.8 / 3.5
(4.9 - 1.2) / (2.0 + 6.5)
Otros
( ( ( 6 - 4 ) ) )
Se puede observar que la calculadora acepta como vlidas las expresiones
anteriores (aunque de momento no devuelve ningn resultado).
Prcticas de compiladores 2003-2004
23
Primera prueba de la calculadora (II)
Arrancar la calculadora y:
probar las siguientes expresiones incorrectas y observar la diferencia de los mensajes
de error.
Terminar cada expresin con un salto de lnea.
Terminar las pruebas con el carcter de finalizacin del fichero de entrada (segn el
sistema operativo).
3.
Detrs del punto decimal tiene que aparecer al menos una cifra.
El mensaje por pantalla es error morfolgico y parser error/sintax error. Ha ocurrido un
error morfolgico, y eso ha generado un error sintctico.
3,7
El separador decimal no es una coma.
El mensaje por pantalla es error morfolgico y parser error/sintax error. Ha ocurrido un
error morfolgico, y eso ha generado un error sintctico.
9/8
La operacin de divisin no est permitida entre nmeros enteros.
El mensaje por pantalla es parser error o sintax error.
2.3*6
Las operaciones entre nmeros de distinto tipo no estn permitidas.
El mensaje por pantalla es parser error o sintax error.
Entradas incorrectas
Prcticas de compiladores 2003-2004
24
Funcionamiento de la funcin yyparse() (I)
El analizador sintctico busca reglas que concuerden con los tokens de la entrada.
El analizador sintctico generado por Yacc/Bison es de tipo LALR(1).
Los estados del autmata estn formados por posibles posiciones en una o ms reglas
parcialmente analizadas.
Cada vez que se lee un nuevo token, si no se puede completar una regla, el analizador
apila el token en una pila interna y transita a un nuevo estado. A esta accin se la
denomina desplazamiento (shift).
Cuando se lee un nuevo token, que permite completar una regla, es decir, que es el
ltimo que faltaba de la parte derecha de una regla, el analizador desapila todos estos
smbolos de la pila interna, apila el smbolo de la parte izquierda de la regla y transita a
un nuevo estado. A esta accin se la denomina reduccin (reduction).
Cada vez que se reduce una regla, se ejecuta el cdigo que tiene asociado, que
habitualmente se denomina accin. Este cdigo lo aporta el usuario de Yacc/Bison. ste
es el mecanismo que permite aadir funcionalidad al anlisis sintctico, es decir, no slo
analizar sintcticamente una entrada sino hacer algo ms, generar alguna salida. Esa
salida se genera en la ejecucin del cdigo asociado a las reglas. Por ejemplo, cuando
se desarrolla un compilador, el cdigo asociado a las reglas se puede utilizar para
realizar el anlisis semntico y generar cdigo.
Funcionamiento bsico
Prcticas de compiladores 2003-2004
25
Funcionamiento de la funcin yyparse() (II)
En la pila interna del analizador sintctico, adems de apilarse los smbolos,
tambin se apilan sus correspondientes valores semnticos o atributos.
Desde el cdigo asociado a una regla se puede acceder a los valores semnticos
de los smbolos de la parte derecha de la regla mediante $1, $2,... , y establecer el
valor del smbolo de la parte izquierda de la regla, a travs de $$.
Por ejemplo, la regla:
exp_entera : exp_entera + exp_entera
podra tener asociada la siguiente accin:
{ $$ = $1 + $3 }
que calcula el valor semntico o atributo del smbolo de la parte izquierda de la
regla como la suma de los atributos de los smbolos primero y tercero de la parte
derecha de la regla.
En las reglas que no tienen accin asociada se utiliza la accin por defecto:
{ $$ = $1 }
Los valores de los smbolos (i)
Prcticas de compiladores 2003-2004
26
Funcionamiento de la funcin yyparse() (III)
Dado que un smbolo no terminal puede tener asociado un valor semntico, es
necesario poder definir el tipo de dicho valor, de la misma manera que se define el
tipo de los valores semnticos de los smbolos terminales o tokens.
La definicin del tipo de valor de un no terminal se hace en la seccin de
definiciones del fichero de especificacin de Yacc/Bison con la declaracin %type,
que es similar a la declaracin %token que se utiliza para definir el tipo de dato de
los tokens.
En la declaracin %type se especifica el nombre del campo de la estructura union
que corresponde al tipo de dato del no terminal.
Despus de las declaraciones %token y %type, cualquier referencia a un valor a
travs de $$, $1, etc, accede al campo concreto dentro de la estructura union.
Por ejemplo, en la calculadora, para definir como entero el tipo de valor semntico
del smbolo no terminal exp_entera, se hace:
%type <entero> exp_entera
%union {
double real;
int entero; }
Recordar que la definicin de la estructura union es:
Los valores de los smbolos (ii)
Prcticas de compiladores 2003-2004
27
Incorporacin de funcionalidad a la calculadora (I)
Mediante las acciones asociadas a las reglas y el clculo de los valores $$ a partir
de los valores $1, $2, . . . se incorpora a la calculadora la funcionalidad de realizar
la operacin introducida por el usuario y mostrar el resultado por pantalla.
Antes de aadir las acciones a las reglas, se define el tipo de valor semntico de
los smbolos no terminales que tengan valor semntico. En el caso de la
calculadora, para conseguir la funcionalidad descrita en sus requisitos, slo es
necesario definir el tipo de valor de los smbolos no terminales exp_entera y
exp_real. Para ello, en la seccin de definiciones se aade:
%type <real> exp_real
%type <entero> exp_entera
%union {
double real;
int entero; }
Recordar que la definicin de la estructura union es:
Prcticas de compiladores 2003-2004
28
Incorporacin de funcionalidad a la calculadora (II)
En el fichero calc.y se aaden las siguientes acciones a las reglas:
lineas: linea \n {}
|lineas linea \n {}
;
linea: exp_real {printf(%f\n, $1);}
|exp_entera {printf(%d\n, $1);}
;
exp_entera: TOK_ENTERO { $$ = $1;}
|exp_entera + exp_entera { $$ = $1 + $3;}
|exp_entera - exp_entera { $$ = $1 - $3;}
|exp_entera * exp_entera { $$ = $1 * $3;}
|( exp_entera ) { $$ = $2;}
;
exp_real: TOK_REAL { $$ = $1;}
|exp_real + exp_real { $$ = $1 + $3;}
|exp_real - exp_real { $$ = $1 - $3;}
|exp_real * exp_real { $$ = $1 * $3;}
|exp_real / exp_real { if ($3) $$=$1/$3;
else $$=$1; }
|( exp_real ) { $$ = $2;}
;
Prcticas de compiladores 2003-2004
29
Anlisis de la entrada 8+9 \n (I)
yylex( ) yyparse( )
yylval
real
entero
pila
smbolo valor
yylex() lee de la entrada el 8, y pasa la
informacin a yyparse() mediante el valor de
retorno de yylex() y la variable yylval.
8 + 9 \n
En las pginas siguientes se muestra la secuencia de operaciones que realiza la funcin
yyparse() durante el anlisis de la entrada 8 + 9 \n, operaciones de reduccin, de
desplazamiento y de ejecucin de las acciones asociadas a las reglas. Tambin se incluyen
las operaciones que realiza yylex().
8
TOK_ENTERO
8 TOK_ENTERO
yyparse(),realiza una operacin de
desplazamiento apilando el smbolo y su
correspondiente valor.
Prcticas de compiladores 2003-2004
30
Anlisis de la entrada 8+9 \n (II)
yyparse() realiza una operacin de reduccin de la regla exp_entera:TOK_ENTERO
se desapilan los smbolos de la parte derecha de la regla junto con sus valores semnticos
se ejecuta la accin asociada a la regla {$$=$1}. En este punto se dispone de $1.
se apila el smbolo de la parte izquierda junto con su valor semntico
pila
smbolo valor
Desapilar los
smbolos de la
parte derecha
parte izquierda
exp_entera
parte derecha
TOK_ENTERO
$$ $1
parte izquierda
exp_entera
parte derecha
TOK_ENTERO
$$ $1
8 8
Ejecucin de la accin
$$ = $1
pila
8
smbolo valor
TOK_ENTERO
8
pila
8
smbolo valor
exp_entera
Apilar el smbolo
de la parte
izquierda
Prcticas de compiladores 2003-2004
31
Anlisis de la entrada 8+9 \n (III)
yylex( ) yyparse( )
pila
8
smbolo valor
exp_entera
yylex() lee de la entrada el +, y pasa la
informacin a yyparse() mediante el valor de
retorno de yylex().
8 + 9 \n
+
+
yyparse(),realiza una operacin de
desplazamiento apilando el smbolo (en este caso el
smbolo + no tiene asociado valor semntico).
Prcticas de compiladores 2003-2004
32
Anlisis de la entrada 8+9 \n (IV)
yylex( ) yyparse( )
yylval
real
entero
pila
8
smbolo valor
exp_entera
+
yylex() lee de la entrada el 9, y pasa la
informacin a yyparse() mediante el valor de
retorno de yylex() y la variable yylval.
8 + 9 \n
9
TOK_ENTERO
9 TOK_ENTERO
yyparse(),realiza una operacin de
desplazamiento apilando el smbolo y su
correspondiente valor.
Prcticas de compiladores 2003-2004
33
Anlisis de la entrada 8+9 \n (V)
yyparse() realiza una operacin de reduccin de la regla exp_entera:TOK_ENTERO
se desapilan los smbolos de la parte derecha de la regla junto con sus valores semnticos
se ejecuta la accin asociada a la regla {$$=$1}. En este punto se dispone de $1.
se apila el smbolo de la parte izquierda junto con su valor semntico
pila
8
smbolo valor
exp_entera
+
Desapilar los
smbolos de la
parte derecha
parte izquierda
exp_entera
parte derecha
TOK_ENTERO
$$ $1
parte izquierda
exp_entera
parte derecha
TOK_ENTERO
$$ $1
9 9
Ejecucin de la accin
$$ = $1
pila
8
smbolo valor
exp_entera
+
9 TOK_ENTERO
9
pila
8
smbolo valor
exp_entera
+
9 exp_entera
Apilar el smbolo
de la parte
izquierda
Prcticas de compiladores 2003-2004
34
Anlisis de la entrada 8+9 \n (VI)
yyparse() realiza una operacin de reduccin de la regla exp_entera:exp_entera + exp_entera
se desapilan los smbolos de la parte derecha de la regla junto con sus valores semnticos
se ejecuta la accin asociada a la regla {$$=$1+$3}. En este punto se dispone de $1 y $3.
se apila el smbolo de la parte izquierda junto con su valor semntico
pila
8
smbolo valor
exp_entera
+
9 exp_entera
pila
smbolo valor
pila
17
smbolo valor
exp_entera
Desapilar los
smbolos de la
parte derecha
Apilar el smbolo
de la parte
izquierda
Ejecucin de la accin
$$ = $1+$3
parte izquierda
exp_entera
$$
parte derecha
exp_entera
$1
8
exp_entera
$3
9
+
$2
parte izquierda
exp_entera
$$
17
parte derecha
exp_entera
$1
8
exp_entera
$3
9
+
$2
Prcticas de compiladores 2003-2004
35
Anlisis de la entrada 8+9 \n (VII)
yyparse() realiza una operacin de reduccin de la regla linea : exp_entera
se desapilan los smbolos de la parte derecha de la regla junto con sus valores semnticos
se ejecuta la accin asociada a la regla printf(%d\n, $1). En este punto se
dispone de $1.
pila
17
smbolo valor
exp_entera
parte izquierda
linea
parte derecha
exp_entera
$$ $1
17
Ejecucin de la accin
printf(%d\n, $1)
Prcticas de compiladores 2003-2004
36
La propagacin de atributos vista sobre el rbol de anlisis
El rbol de anlisis sintctico permite visualizar el clculo de atributos sintetizados
en las acciones asociadas a las reglas. Se observa claramente la propagacin de
los atributos por los nodos del rbol.
$$=$1
lneas
lnea \n
exp_entera
exp_entera exp_entera +
TOK_ENTERO TOK_ENTERO
8 + 9 \n
8 $$
El analizador lxico actualiza la variable yylval con el
valor semntico del ltimo token reconocido.
17 $$
9 $$
$$=$1
$$=$1+$3
$$=$1+$3
printf(%d\n, $1)
8 $$
9 $$

También podría gustarte