1 / 20

COMPILADORES

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.

cynara
Download Presentation

COMPILADORES

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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). dnumnum.num numnum digito | digito digito 0|1|2|3|4|5|6|7|8|9

  3. 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: a = m x be donde: a= numero real. m= mantisa. b= base(2, 8, 10, 16,…) e= exponente. Porejemplo: 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

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

  5. DESARROLLO (Tabla de reglas)

  6. 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 1 num 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;

  7. ÁRBOL Los círculos amarillos indican la producción que se aplicó. Árbol totalmente creado, el siguiente paso es decorarlo. dnum . num 1 num 2 num digito 2 num digito digito 2 num 3 6 digito 6 2 2 3 digito 9 5 7 3 8 4

  8. 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 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: . num num num digito num digito num digito 2 (7)digito.v=3; digito.c=0; digito (digito.v=3) (digito.c=0) 2 digito 7 3 5 4

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

  10. Continuamos recorriendo el árbol ascendentemente. Aplicamos la siguiente acción semántica (3) (3) num.v= digito.v if (bandera=true) entoncesnum.c=1 sino num.c=0 dnum Pila Borramos la pila y asignamos los nuevos valores num . num num (num.v=3) (num.c=0) digito num num 3 0 num digito 2 num digito 3 2 num digito 3 0 digito (digito.v=3) (digito.c=0) digito 7 3 5 4

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

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

  13. Si continuamos recorriendo el árbol y obtenemos los valores para sustituirlos en la fórmula almacenada en la pila. dnum num num.v=(3*10)+2 num.c=(0+0) num . Pila 2 num (num.v=3) (num.c=0) digito (digito.v=2) (digito.c=0) num num 3 0 num digito num 6 digito 3 2 2 digito (digito.v=3) (digito.c=0) dnum (3*10)+digito.v 30+0 0+0 digito 7 3 5 4

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

  15. Ahora aplicamos la producción (1) dnum dnum.v=32 +(num2.v*10^(-num2.c)) (1)bandera=true . 1 num num num.v= 32 num.c= 0 Pila raíz(dnum) 32 +(num2.v*10^(-num2.c)) 32+0 0 num digito num (num.v=3) (num.c=0) digito (digito.v=2) (digito.c=0) num digito 2 dnum num 32 0 2 digito (digito.v=3) (digito.c=0) digito 5 4 3

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

  17. Continuamos el recorrido ascendente , aplicando la acción semántica (3) (3) num.v= digito.v if (bandera=true) entoncesnum.c=1 sino num.c=0 dnum dnum.v=32 +(num2.v*10^(-num2.c)) Algo importante es que ahora la bandera tiene el valor de true, por lo tanto el atributo c tiene el valor de 1. num num num.v= 32 num.c= 0 Pila . digito num num 4 0 num num (num.v=3) (num.c=0) digito (digito.v=2) (digito.c=0) num (num.v=4) (num.c=1) digito num digito 4 0 2 2 digito (digito.v=4) (digito.c=0) 5 digito (digito.v=3) (digito.c=0) raíz(dnum) 32 +(num2.v*10^(-num2.c)) 32+0 0 8 3 4

  18. Continuamos recorriendo el árbol hasta llegar a la raíz. Obteniendo el siguiente árbol 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) digito (digito.v=2) (Digito.c=1) num (Num.v=(4*10)+5) (Num.c=2) num (num.v=3) (num.c=0) digito (digito.v=2) (digito.c=0) num (num.v=4) (num.c=1) digito (digito.v=5) (digito.c=1) 2 digito (digito.v=3) (digito.c=0) 2 digito (digito.v=4) (digito.c=0) 5 3 4

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

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

More Related