Documente Academic
Documente Profesional
Documente Cultură
ANÁLISIS SEMÁNTICO
MÓDULO: IX “B”
FECHA: 3/2/2010
EJERCICIO 6.2
• Escriba una gramática con atributos para el valor
de punto flotante de un número decimal dado
por la gramática siguiente.
– (SUGERENCIA: Utilice un atributo conteo para contar el
número de dígitos a la derecha del punto decimal).
32.452
Normalizado 3.2452 E 1
Sin normalizar 32452 E -3
El ejercicio plantea como sugerencia que se utilice un atributo conteo para contar el
numero de dígitos hacia la derecha del punto decimal, por lo cual utilizaré la forma no
normalizada de punto flotante.
Además se trabajará en base 10.
Atributos:
v para almacenar el valor numérico.
c valores de 0 – 1 para al final del recorrido del árbol conocer el
numero de dígitos a la derecha del punto.
Utilizaré atributos sintetizados.
Dentro del analizador semántico haremos uso de una variable booleana bandera
inicializada con false que nos permitirá establecer el momento que empezamos a contar
los dígitos de la parte derecha.
Los valores que ingresan son enteros por ello se los debe tratar a estos valores como
tales, por ello se los multiplica por 10 y se realiza la acción semántica asignada. (Esta
operación esta establecida en las reglas semánticas del siguiente cuadro)
DESARROLLO (Tabla de reglas)
REGLAS GRAMATICALES REGLAS SEMÁNTICAS
1 dnum num1 . num2 bandera=true
dnum.v=num1.v +(num2.v*10^(-num2.c))
Imprimir(num1.v.concatenado(num2.v)+ “E -”+num2.c)
2 num num1 digito num.v=(num1.v*10)+digito.v
num.c=(num1.c+digito.c)
3 num digito num.v= digito.v
if (bandera=true) entonces num.c=1 sino num.c=0
4 digito 0 digito.v=0; digito.c=0;
5 digito 1 digito.v=1; digito.c=0;
6 digito 2 digito.v=2; digito.c=0;
7 digito 3 digito.v=3; digito.c=0;
8 digito 4 digito.v=4; digito.c=0;
9 digito 5 digito.v=5; digito.c=0;
10 digito 6 digito.v=6; digito.c=0;
11 digito 7 digito.v=7; digito.c=0;
12 digito 8 digito.v=8; digito.c=0;
13 digito 9 digito.v=9; digito.c=0;
CREACION DEL ÁRBOL
dnum
1 num . num
.
1 num num
2 num digito
2 num digito
2 num digito
3 digito 6 6 2
2
3 digito
9 5
7 3
8 4
DECORAR EL ÁRBOL SINTÁCTICO
Ahora decoraremos cada nodo con sus respetivos atributos (v para el valor y c para
el contador).
Para ello hacemos uso de las reglas semánticas.
Empezamos recorriendo dnum
el árbol desde los nodos
hacia la raíz.
Observemos que el
primer nodo se obtuvo num . num
de la produccion (7) de
nuestra gramática, por num digito
ello asociamos las num digito
acciones semánticas y
realizamos:
num digito
(7) digito.v=3; digito 2
2
digito.c=0; (digito.v=3)
(digito.c=0) digito
7 3
4 5
PILA
Estructura
estado
símbolo
valor
conteo
num
digito
3
0
Continuamos recorriendo el árbol ascendentemente. Aplicamos la siguiente acción
semántica (3)
(3) num.v= digito.v
if (bandera=true) entonces num.c=1
sino num.c=0 dnum
Pila
num
Borramos la pila num .
y asignamos los
nuevos valores
num digito
(num.v=3) num digito
num (num.c=0)
num
3
2
0 num digito
3 2
digito
num (digito.v=3)
digito (digito.c=0) digito
3
0
7 3
4 5
Ahora siguiendo el recorrido, se aplica la siguiente acción semántica (2)
Además debemos considerar dentro del algoritmo de recorrido del árbol que cuando se
encuentre un nodo que se divide en ramas, se debe almacenar los valores en la pila y
empezar a recorrer la rama derecha. dnum
(2 ) num.v=(num1.v*10)+digito.v
num.c=(num1.c+digito.c) num
num .
num.v=(3*10)+digito.v
num.c=(0+digito.c)
Pila
Borramos la pila
y asignamos los 2 num num digito
digito
nuevos valores (num.v=3)
(num.c=0)
dnum
(3*10)+digito.v 2 num digito
30+0 2
3 digito
0+0 (digito.v=3)
(digito.c=0) digito
num
num
3 7 3
4 5
0
Bien en la pila queda almacenada la fórmula, que será utilizada luego de recorrer
la rama derecha. En este caso toca aplicar la acción semántica (6)
(6) digito.v=2 dnum
digito.c=0
num
num.v=(3*10)+digito.v num
num.c=(0+digito.c) .
dnum
num
num.v=(3*10)+2 num
num.c=(0+0) .
dnum
Pila
num num
dnum
num.v= 32 .
num.c= 0
num
32
0 num digito
(num.v=3) (digito.v=2) num digito
num (num.c=0) (digito.c=0)
num
3
0 num digito
digito 2 2
(digito.v=3)
dnum
(digito.c=0) digito
(3*10)+digito.v
30+0
0+0
3 5
4
Ahora aplicamos la producción (1) dnum
(1) bandera=true dnum.v=32 +(num2.v*10^(-num2.c))
1 num
. num
num.v= 32
num.c= 0
Pila
num digito
raíz(dnum) num digito
32 +(num2.v*10^(-num2.c)) (num.v=3) (digito.v=2)
32+0 (num.c=0) (digito.c=0)
0 num digito
2
dnum 2
digito
num digito
(digito.v=3) 5
32 (digito.c=0)
0
4
3
Igual que en pasos anteriores empezamos a recorrer la parte derecha de dnum.
Quedan en la pila almacenadas las formulas que se deben aplicar.
Y se recorre el árbol ascendentemente, ahora desde el valor 4, donde se aplicó la
producción (8).
dnum
dnum.v=32 +(num2.v*10^(-num2.c))
(8) digito.v=8
digito.c=0
num
num
num.v= 32
num.c= 0 .
Pila
num digito num digito
(num.v=3) (digito.v=2)
num (num.c=0) (digito.c=0)
digito num digito
4
0 2
2
digito digito 5
(digito.v=3) (digito.v=4)
raíz(dnum) (digito.c=0)
32 +(num2.v*10^(-num2.c)) (digito.c=0)
32+0
0 3 8 4
Continuamos el recorrido ascendente , aplicando la acción semántica (3)
(3) num.v= digito.v
if (bandera=true) entonces num.c=1
sino num.c=0
Algo importante es que ahora dnum
la bandera tiene el valor de dnum.v=32 +(num2.v*10^(-num2.c))
true, por lo tanto el atributo c
tiene el valor de 1. num
num
Pila num.v= 32
num.c= 0 .
num digito
num
num num digito
4 num
(num.v=3) (digito.v=2) digito
0 (num.v=4)
(num.c=0) (digito.c=0) (num.c=1)
num
digito 2
4 2 digito
digito 5
0 (digito.v=4)
(digito.v=3)
raíz(dnum) (digito.c=0) (digito.c=0)
32 +(num2.v*10^(-num2.c))
32+0
0 3 8 4
Continuamos recorriendo el árbol hasta llegar a la raíz. Obteniendo el siguiente árbol
dnum
(dnum.v=32+(152^-3))
num . num
(num.v=(3*10)+2) (num.v=(45*10)+2)
(num.c=0+0) (num.c=3)
num digito
(Num.v=(4*10)+5) (digito.v=2)
(Num.c=2) (Digito.c=1)
num digito
(num.v=3) (digito.v=2)
(num.c=0) num
(digito.c=0) digito
(num.v=4)
(digito.v=5)
(num.c=1)
(digito.c=1)
digito 2
(digito.v=3) 2 digito
(digito.c=0) (digito.v=4)
(digito.c=0)
5
3
4
dnum
(dnum.v=32+(152^-3))
num . num
(num.v=(3*10)+2) (num.v=(45*10)+2)
(num.c=0+0) (num.c=3)
digito
num
(digito.v=2)
(Num.v=(4*10)+5)
(Digito.c=1)
num (Num.c=2)
digito
(num.v=3) (digito.v=2)
(num.c=0) num
(digito.c=0) digito
(num.v=4) 2
(digito.v=5)
(num.c=1)
(digito.c=1)
digito
(digito.v=3) 2 digito
(digito.c=0) (digito.v=4)
(digito.c=0)
5
3
4
Al final de todo el recorrido y aplicación de las reglas semánticas,
obtendremos lo siguiente:
dnum.v= 32.452
Y el mensaje :
32452 E -3