análisis semántico m.c. juan carlos olivares rojas noviembre 2009

39
Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Upload: lucio-hilario

Post on 22-Jan-2016

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Análisis Semántico

M.C. Juan Carlos Olivares Rojas

Noviembre 2009

Page 2: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Agenda• Analizador semántico

• Verificación de tipos en expresiones.

• Conversión de tipos.

• Acciones agregadas en un analizador sintáctico descendente (top-down).

• Pila semántica en un analizador sintáctico ascendente (bottom-up).

Page 3: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Agenda• Administración de la tabla de símbolos. • Manejo de errores semánticos.

Page 4: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Analizador Semántico• Ajuste significativo

• Comprobación de tipos: operandos-operadores

• Comprobación del flujo de control:

• for(;;) { • … • break; • w= a+2; }

Page 5: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Analizador Semántico• Comprobación de unicidad

• int a; • char a; //una sola vez

• Comprobación relacionadas con nombres

• ¿Cómo se realiza la comprobación de unicidad? A través de la tabla de símbolos.

Page 6: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Analizador Semántico• Tabla de símbolos:

– Estructura en memoria – Almacena información sobre los tipos– Se debe de agregar una estructura en

memoria que permita identificar nombres.– Los generadores de analizadores léxicos ya

tienen una tabla de símbolos primitivos.

• Sistemas de tipo: – Tipo básico: entero, carácter, real, lógico – Nombres de tipo

Page 7: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Analizador Semántico– Constructores de tipo: estructuras, uniones,

objetos – Apuntadores: referencias a tipos – Funciones a=suma();

• Sistema de tipos: conjunto de reglas que determinan el criterio para asignar expresiones de tipo a las diferentes partes del código fuente.

• Los sistemas de tipos dependen de los lenguajes.

Page 8: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Analizador Semántico• Cada analizador semántico implementa

un sistema de tipo (no necesariamente tan robusto)

• Comprobación de tipos puede ser dinámica y/0 estática.

• Estática: en tiempo de compilación

• Dinámica: en tiempo de ejecución.

Page 9: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Analizador Semántico• char a[5]; • strcpy(a, “abcdefghijk”);

• Java es un lenguaje con un sistema de tipos más fuerte que C/C++ que lo hace más seguro pero a la vez un poco más deficiente.

• Los lenguajes interpretados en el pasado eran más susceptibles a errores en tiempo de ejecución pero las cosas han cambiado.

Page 10: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Analizador Semántico• En general la tabla de símbolos debe

contener la siguiente estructura para validar la parte semántica:

Símbolo { nombre; tipo; ámbito; }

Page 11: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Verificación de tipos• La verificación de los tipos de datos se

hace asignando el valor de tipo de cada una de los componentes léxicos.

• Estos valores se comparan para verificar que los tipos de datos coincidan y sean congruentes, de lo contrario no se pueden realizar los cálculos.

Page 12: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Conversión de tipos• Hay situaciones en las cuales se tiene un

valor de un tipo dado y se desea almacenar ese valor en una variable de un tipo diferente.

• En algunos tipos es posible almacenar simplemente el valor sin una conversión de tipos; lo que se denomina conversión automática.

• A la conversión de tipos se le llama coerción o casting.

Page 13: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Conversión de Tipos• Esto sólo es posible en algún lenguaje de

programación, si el compilador reconoce que la variable destino tiene la suficiente precisión para contener el valor origen.

• En Java se puede almacenar un valor byte en una variable int, dado que este tipo de datos es de mayor precisión que el primero.

Page 14: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Conversión de Tipos• A esto se le llama ensanchamiento o

promoción, dado que el tipo más pequeño se ensancha o promociona al tipo compatible más grande. Si por el contrario, se desea asignar un valor de variable int a una variable byte se necesita realizar una conversión de tipos explícita.

• En algunos casos se puede realizar la conversión pero se pueden perder datos, como por ejemplo al pasar un valor flotante a un entero.

Page 15: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Conversión de tipos• A esto se le llama estrechamiento, dado

que se estrecha explícitamente el valor para que quepa en el destino.

• La conversión de un tipo se realiza poniendo delante un nombre de tipo entre paréntesis, por ejemplo, (tipo) valor.

• Ejemplos de coerción: byte a; int b; a=(byte) b;

Page 16: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Comprobación de Tipos• Existen dos tipos de comprobación:

estática y dinámica.

• La comprobación ayuda a evitar la mayoría de los errores de programación.

• Ejemplos de comprobación de tipos: Para saber si el operador aplicado a los operadores es correcto.

Page 17: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Comprobación de Tipos• Comprobación de flujo de control. Se

debe verificar que las instrucciones que cambia el flujo de un programa sean válidos. Ejemplo: break, goto.

• Comprobación de unicidad: definir un objeto una sola vez.

• Comprobación relacionadas con nombres. El mismo nombre debe aparecer dos veces. Variables que se declaran pero no utilizan

Page 18: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Comprobación de Tipos• La comprobación de tipos es la más

complicada. Las demás comprobaciones son rutinarias.

• El operador % ocupa que los dos operandos sean enteros.

• + es una función suma(a,b) que está sobrecargada para distintos tipos de datos

Page 19: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Comprobación de Tipos• Diferenciar el uso de +, * enteros que con

punteros (aritmética de punteros)

• Al conjunto de reglas que se definen para la comprobación de los tipos de datos se denomina sistema de tipos

• La mayoría de veces la recuperación de errores se suele omitir ya que el programa no finaliza pero tal vez no obtenga los valores deseados

Page 20: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Comprobación de Tipos• Generalmente en la etapa de análisis

sintáctico se suelen agregar los tipos a la tabla de símbolos.

• Se revisa el árbol sintáctico para comprobar los tipos asignados.

• Existen conversiones explícitas en las cuales el usuario indica el tipo de datos:

• a = (int)(23.3/18.2);

Page 21: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Comprobación de Tipos• Las conversiones implícitas requieren de

mayor tiempo de ejecución.

• Un ciclo de 1 a N tardó5.4 y 48.4 nanosegundos utilizando conversiones implícitas.

• Polimorfismo: una función puede tener el mismo nombre con diferentes elementos. El tipo de datos debe ser diferente.

Page 22: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Comprobación de Tipos• Un ejemplo de polimorfismo son las

plantillas en algún lenguaje de programación.

• Se debe considerar el ámbito de las variables (locales y globales).

Page 23: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Práctica 10• Realizar un parser en Java para

documentos en XML.

• Se debe de validar archivos del lenguaje clima visto previamente

• ¿Cómo se realiza el análisis sintáctico en XML?

• ¿Cómo se puede manejar el análisis léxico?

Page 24: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Parser DOM en Java• Clases DocumentBuilderFactory• Clase DocumentBuilder• Clase Document

• Método parser

• Análisis utilizando implementación de DOM a través de todo el documento como si fuera un árbol.

Page 25: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Acciones Agregadas a Parsers• Muchas de las actividades que realiza un

analizador semántico no son estándares, dependerán del objetivo del lenguaje de programación; por ejemplo, en algunas aplicaciones es interesante conocer que los datos estén en algún rango válido o que ciertos valores se utilicen para uso reservado.

• En general los analizadores semánticos se llegan a realizar a través de la modificación de parsers.

Page 26: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Pila semántica en un ASem• La pila juega un papel fundamental en el

desarrollo de cualquier analizador semántico. Dentro de cada elemento de la pila se guardan los valores que pueden tener una expresión.

Page 27: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Admon. Tabla de Símbolos• La tabla de símbolos también recibe el

nombre de ambiente. Un ambiente contiene un conjunto de parámetros que sólo son visibles en ese ambiente. • La tabla de símbolos se mantiene durante todo el proceso de traducción agregando elementos específicos en cada paso.

Page 28: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Tabla de símbolos• Funcionalidades básicas:

• Inserta(símbolo)• Existe(nombre) •

• Se agrega una primitiva más: Tipo (nombre)

• ¿El análisis léxico crea la tabla de símbolos?

• No

Page 29: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Tabla de Símbolos• ¿Cómo se agrega la semántica al

analizador sintáctico?

• Declaración TIPO {tipo=obtengo(yytext());} listavar PYC

• listavar var {inserta(símbolo);} | var {inserta(simbolo);}

• var ID {simbolo=yytext; símbolo.tipo=tipo; simbolo.amb=ambito;}

Page 30: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Tabla de SímbolosExprlog PI exprlog{A=A;} PD | NOT exprlog {A=A;} | exprlog {A1=A;} OPLOG exprlog {A2=A if(A1==INT && A2==INT) A=INT; else A=ERROR_TIPO;}

Page 31: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

• int a;

• a = (int) 10.1;

Page 32: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Manejo Errores Semánticos• Algunos problemas se presentan durante

la fase de gestión de memoria al pasar argumentos o al crear la pila semántica.

• Muchos errores se generan durante la etapa del enlazador, al tratar de obtener código existente de algunas funciones/métodos ya implementadas en bibliotecas/APIs

Page 33: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Examen• Analizador semántico que permita

construir objetos de java con el siguiente sistema de tipos:

• Validar unicidad (se deben de manejar paquetes para poderse repetir)

• El tipo de datos abstracto (clase) debe estar previamente declarado y debe de coincidir plenamente.

Page 34: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Examen• Si se desea realizar “operaciones

aritméticas” se deberá mantener el sistema de compatibilidad de promoción hacia la clase base más alta (utilizando herencia).

• Si se trata de igualdad deberán de ser del mismo tipo tanto lado derecho como el izquierdo o bien realizar la conversión explicita (coerción). Cuando sea de un tipo más grande a uno pequeño se indicará un mensaje de advertencia.

Page 35: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Ejemplo examenpublic class ejemplo{};

public class base extends ejemplo{};public class profe extends ejemplo{};public class columna extends base {};

public class ejemplo2 { base B = new base(); profe c, m; m = 23 * b; B = c;}•

Page 36: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Ejemplo Examen• Este programa devuelve lo siguiente:

• Sintaxis correcta!!!• Asignación correcta• Asignación incorrecta• Asignación correcta (advertencia son del

mismo tipo padre pero diferentes clases)

Page 37: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Semántica en YACC• A : B C D {$$=$1*$3};• Expr: ‘(’ Expr ‘)’ {$$=$2};

• YYSTYPE determina el tipo de datos del token. En general se maneja de forma predeterminada entero.

Page 38: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Referencias

Page 39: Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

¿Preguntas?