COMPILADORES

20
COMPILADORES ANÁLISIS SEMÁNTICO ALUMNO: EDISON ROJAS L. DOCENTE: ING. WILMAN CHAMBA MÓDULO: IX “B” FECHA: 3/2/2010 versidad Nacional de Lo

description

Universida d Nacional de Loja. COMPILADORES. ALUMNO :EDISON ROJAS L. DOCENTE :ING. WILMAN CHAMBA MÓDULO :IX “B” FECHA :3/2/2010. ANÁLISIS SEMÁNTICO. 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. - PowerPoint PPT Presentation

Transcript of COMPILADORES

Page 1: COMPILADORES

COMPILADORES

ANÁLISIS SEMÁNTICO

ALUMNO: EDISON ROJAS L.

DOCENTE: ING. WILMAN CHAMBA

MÓDULO: IX “B”

FECHA: 3/2/2010

Universidad Nacional de Loja

Page 2: COMPILADORES

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

dnum num . num

num num digito | digito

digito 0|1|2|3|4|5|6|7|8|9

Page 3: COMPILADORES

ANÁLISISPara 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:

a = m x be

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.452Normalizado 3.2452 E 1Sin normalizar 32452 E -3

Page 4: COMPILADORES

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)

Page 5: COMPILADORES

DESARROLLO (Tabla de reglas)REGLAS GRAMATICALES REGLAS SEMÁNTICAS

1 dnum num1 . num2 bandera=truednum.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.vnum.c=(num1.c+digito.c)

3 num digito num.v= digito.vif (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;

Page 6: COMPILADORES

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;

dnum

num . num1

1 dnum num1 . num2

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;

Page 7: COMPILADORES

ÁRBOL

dnum

num.

num

num digito

digito

3

2

num digito

num digito

digito5

4

2

7

3

2

1

6

2

26

8

93

Los círculos amarillos indican la producción que se aplicó.Árbol totalmente creado, el siguiente paso es decorarlo.

Page 8: COMPILADORES

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.

dnum

num . num

num digito

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

3

2

num digito

num digito

digito

54

2

7

Empezamos recorriendo el árbol desde los nodos hacia la raíz.Observemos que el primer nodo se obtuvo de la produccion (7) de nuestra gramática, por ello asociamos las acciones semánticas y realizamos:

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

Page 9: COMPILADORES

PILA

estadosímbolo

valorconteo

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

Estructura

Por lo tanto nuestra pila lleva los siguientes datos:

numdigito

30

Page 10: COMPILADORES

Continuamos recorriendo el árbol ascendentemente. Aplicamos la siguiente acción semántica (3)

(3) num.v= digito.vif (bandera=true) entonces num.c=1 sino num.c=0 dnum

num . num

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

digito

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

3

2

num digito

num digito

digito

54

2

7

3

numdigito

30

numnum

30

PilaBorramos la pila y asignamos los nuevos valores

Page 11: COMPILADORES

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

numnum.v=(3*10)+digito.vnum.c=(0+digito.c)

.num

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

digito

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

3

2

num digito

num digito

digito

54

2

7

3

dnum(3*10)+digito.v

30+00+0

numnum

30

PilaBorramos la pila y asignamos los nuevos valores

2

(2 ) num.v=(num1.v*10)+digito.v num.c=(num1.c+digito.c)

Page 12: COMPILADORES

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 digito.c=0

dnum

numnum.v=(3*10)+digito.vnum.c=(0+digito.c) .

num

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

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

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

3

2

num digito

num digito

digito

54

2

7

3

dnum(3*10)+digito.v

30+00+0

numnum

30

Pila 2

6

Page 13: COMPILADORES

Si continuamos recorriendo el árbol y obtenemos los valores para sustituirlos en la fórmula almacenada en la pila.

dnum

numnum.v=(3*10)+2num.c=(0+0) .

num

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

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

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

3

2

num digito

num digito

digito

54

2

7

3

dnum(3*10)+digito.v

30+00+0

numnum

30

Pila 2

6

Page 14: COMPILADORES

Hasta el momento tenemos lo siguiente:

dnum

numnum.v= 32num.c= 0

.num

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

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

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

3

2

num digito

num digito

digito

54

2

dnum(3*10)+digito.v

30+00+0

numnum

30

Pila

dnumnum320

Page 15: COMPILADORES

Ahora aplicamos la producción (1) dnumdnum.v=32 +(num2.v*10^(-num2.c))

numnum.v= 32num.c= 0

. num

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

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

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

3

2

num digito

num digito

digito5

4

2

Pila

dnumnum320

1

raíz(dnum)32 +(num2.v*10^(-num2.c))

32+00

(1) bandera=true

Page 16: COMPILADORES

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

dnumdnum.v=32 +(num2.v*10^(-num2.c))

numnum.v= 32num.c= 0 .

num

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

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

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

3

2

num digito

num digito

digito(digito.v=4)(digito.c=0)

5

4

2

Pila

raíz(dnum)32 +(num2.v*10^(-num2.c))

32+00 8

(8) digito.v=8 digito.c=0

numdigito

40

Page 17: COMPILADORES

Continuamos el recorrido ascendente , aplicando la acción semántica (3)

(3) num.v= digito.vif (bandera=true) entonces num.c=1 sino num.c=0

Algo importante es que ahora la bandera tiene el valor de true, por lo tanto el atributo c tiene el valor de 1.

dnumdnum.v=32 +(num2.v*10^(-num2.c))

numnum.v= 32num.c= 0 .

num

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

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

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

3

2

num digito

num(num.v=4)(num.c=1)

digito

digito(digito.v=4)(digito.c=0)

5

4

2

Pila

raíz(dnum)32 +(num2.v*10^(-num2.c))

32+00 8

numdigito

40

numnum

40

Page 18: COMPILADORES

Continuamos recorriendo el árbol hasta llegar a la raíz. Obteniendo el siguiente árboldnum

(dnum.v=32+(152^-3))

num(num.v=(3*10)+2)

(num.c=0+0)

. num(num.v=(45*10)+2)

(num.c=3)

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

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

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

3

2

num(Num.v=(4*10)+5)

(Num.c=2)

digito(digito.v=2)(Digito.c=1)

num(num.v=4)(num.c=1)

digito(digito.v=5)(digito.c=1)

digito(digito.v=4)(digito.c=0)

5

4

2

Page 19: COMPILADORES

dnum(dnum.v=32+(152^-3))

num(num.v=(3*10)+2)

(num.c=0+0)

. num(num.v=(45*10)+2)

(num.c=3)

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

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

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

3

2

num(Num.v=(4*10)+5)

(Num.c=2)

digito(digito.v=2)(Digito.c=1)

num(num.v=4)(num.c=1)

digito(digito.v=5)(digito.c=1)

digito(digito.v=4)(digito.c=0)

5

4

2

Page 20: COMPILADORES

Al final de todo el recorrido y aplicación de las reglas semánticas, obtendremos lo siguiente:

dnum.v= 32.452Y el mensaje :

32452 E -3