Está en la página 1de 24

TALLER 2 - CORTE 3

EXPLIQUE UN EJEMPLO DE ANÁLISIS SEMÁNTICO , DIFERENTE AL EXPLICADO EN CLASE POR EL GRUPO EXOPSITOR. SUBIR EN ARCHIVO
DE WORD DE MANERA INDIVIDUAL ( TODOS MENOS LOS EXPOSITORES DE ESTE TEMA)

Alumno: Victor Antonio Cardoza Manjarres

Asignatura: Compiladores

Corporación universitaria Rafael Núñez

lunes, 31 de mayo de 2021


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).

dnum num . num


num num digito | digito digito
0|1|2|3|4|5|6|7|8|9
ANÁLISIS
Para trabajar con punto flotante de un numero real se hace uso de notación científica. La estructura de
Punto flotante para un numero decimal:
e
a=mxb
donde: a= numero real.
m= mantisa.
b= base(2, 8, 10, 16,…)
e= exponente.
Por ejemplo:
10.75= 10.75 x 100
1.075 x 101
REGLA: Como su nombre lo indica el punto flotante permite mover el punto hacia la derecha o
izquierda y el exponente tomará el valor de los espacios que recorra.
si se mueve hacia la el exponente será negativo si se

mueve hacia la el exponente será negativo

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

Trabajemos con la siguiente cadena: 32.452 la cual representada en punto flotante sin normalizar
sería: 32452 E -3
Para ello simplemente seguimos las reglas gramaticales.
Por ejemplo con la primera producción obtenemos los primeros nodos.
Además bandera=false;

1 dnum num1 . num2

1 num
.
num
dnum
Y asi continuamos hasta obtener los siguientes nodos:
Dentro de los círculos amarillos especificaré la regla gramatical que se utilizó, para obtener los nodos
del árbol;
ÁRBOL

Los círculos amarillos indican la producción que se aplicó. Árbol


totalmente creado, el siguiente paso es decorarlo.
dnum

.
1 num num

digito 2
2 num num digito

2 num digito
3 digito 6 6
2
2

3 digito 9
7 5
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 el dnum
árbol desde los nodos hacia
la raíz.
Observemos que el primer
nodo se obtuvo de la num . num
produccion (7) de nuestra
gramática, por ello asociamos
las acciones semánticas y num digito
realizamos: num digito

num digito
(7) digito.v=3; digito 2
2
digito.c=0;
digito
7 3
=0)
(digito.c
=3)
(digito.v

4 5
PILA

Mientras realizamos el recorrido debemos apoyarnos en una pila para poder almacenar los datos
que se van calculando:

Estructura

estado símbolo
valor conteo

Por lo tanto nuestra pila lleva los siguientes datos:

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
Borramos la pila y num
asignamos los num .
nuevos valores

num digito
num num 3 num digito
0
2
0)
(digito.c=
3)
(digito.v=
3digito

num digito
7 3

0)
(num.c=
=3)
(num.v
2

num digito 3 digito


0

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 digito num digito
nuevos valores (num.v=3)
dnum
(num.c=0)
(3*10)+digito.v
30+0 2 num digito
0+0 3 2
digito
(digito.v=3)
num num 3 (digito.c=0) digito
0
7
3 5
4
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
.

Pila

num digito
)
(digito.c=0
)
(digito.v=3
3digito
7

2 num
(num.v=
(num.c=

num.c=(0+digito.c)
to.v
num.v=(3*10)+digi
num
0)

3)
num
3

3 num digito
0 2
(digito.v=
(digito.c=

digito
6

digito
dnum
0)

2)
2

(3*10)+digito.v
30+0 4 5
0+0
Si continuamos recorriendo el árbol y obtenemos los valores para sustituirlos en la fórmula
almacenada en la pila.

dnum

num
num
num.v=(3*10
)+2 .
num.c=(0+0)
Pila
2 num digito num digito
(num.v= (digito.v=
num
3) 2)
num (digito.c=
(num.c=
3 0)
num digito
0) 2
0 6
3digito 2
digito
dnum (digito.v=3
(3*10)+digito.v )
30+0 (digito.c=0 4 5
0+0 )
7 3
Hasta el momento tenemos lo siguiente:

Pila dnum

num
num
num.v= 32
num.c= 0
.
dnu
m
nu
m
32
0

num digito
nu (digito.v=2)
(num.v=3) num digito
m (digito.c=0)
nu (num.c=0)
m
3 num digito
0 digito 2 2
(digito.v=3)
(digito.c=0)
digito
dnum
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

raíz(dnum) digito num digito


num
32 +(num2.v*10^(-num2.c)) (digito.v=2)
32+0 (num.v=3) (digito.c=0)
0 (num.c=0)
num digito
2
dnum num 32 digito 2
0 (digito.v=3) digito
(digito.c=0) 5
3
4
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

m
nu
producción (8).
dnum
dnum.v=32 +(num2.v*10^(-num2.c))
(8) digito.v=8
digito.c=0
num.v= 32
num.c= 0
.
Pila
num digito num digito
(num.v=3) (digito.v=2)
num digito 4 (digito.c=0)
(num.c=0) num

m
nu
0 digito

2 2
digito 5
digito
(digito.v=3) (digito.v=4)
(digito.c=0) (digito.c=0)
raíz(dnum)
32 +(num2.v*10^(-num2.c))
3
32+0
0
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 la dnum
bandera tiene el valor de true, por lo dnum.v=32 +(num2.v*10^(-num2.c))
tanto el atributo c
tiene el valor de 1. num
num
Pila num.v= 32 . digito
num.c= 0 num
nu
m digito
num num
nu (num.v=3) (digito.v=2) digito
(digito.c=0) (num.v=4)
m (num.c=0)
4 (num.c=1)
0
2
2
nu digito digito 5
(digito.v=3) (digito.v=4)
m (digito.c=0)
digi (digito.c=0)
to 4
8

0 3

raíz(dnum)
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.c=0) (digito.v=2) num


(digito.c=0) (Num.v=(4*10)+5)
num digit (Num.c=2)
(num.v=3) o num
digito digito (di .v=2)
gito (Digito.c=1)
(num.v=4) (digito.v=5)
(num.c=1) (digito.c=1)
digito 2
(digito.v=3)
(digito.c=0) 2 digito
(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)

2 num
digito
(digito.v=3) (Nu
num (digito.c=0) digito (digito.v=2)
m.v
(num.v=3) (digito.c=0)
=(4*
(num.c=0)
3 10)+
5) 1 =0) digito
(digito.v=2)
(Nu ) (Digito.c=1)
m.c 4

=2) d
i digito
g (digito.v=5)
n (digito.c=1) 2
i
u t
m o
( (
n d 5
u i
g
m i
. t
o
v
.
= v
4 =
4
) )
(
(
n
d
u i
m g
i
. t
c o
= .
c
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

También podría gustarte