You are on page 1of 39

Anlisis Semntico

M.C. Juan Carlos Olivares Rojas

Noviembre 2009

Agenda
Analizador semntico

Verificacin de tipos en expresiones.


Conversin de tipos. Acciones agregadas en un analizador sintctico descendente (top-down). Pila semntica en un analizador sintctico ascendente (bottom-up).

Agenda
Administracin de la tabla de smbolos.

Manejo de errores semnticos.

Analizador Semntico
Ajuste significativo

Comprobacin de tipos: operandos-operadores


Comprobacin del flujo de control: for(;;) { break; w= a+2; }

Analizador Semntico
Comprobacin de unicidad

int a; char a; //una sola vez Comprobacin relacionadas con nombres Cmo se realiza la comprobacin unicidad? A travs de la tabla de smbolos. de

Analizador Semntico
Tabla de smbolos:
Estructura en memoria Almacena informacin sobre los tipos Se debe de agregar una estructura en memoria que permita identificar nombres. Los generadores de analizadores lxicos ya tienen una tabla de smbolos primitivos.

Sistemas de tipo:
Tipo bsico: entero, carcter, real, lgico Nombres de tipo

Analizador Semntico
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 cdigo fuente. Los sistemas de tipos dependen de los lenguajes.

Analizador Semntico
Cada analizador semntico implementa un sistema de tipo (no necesariamente tan robusto) Comprobacin de tipos puede ser dinmica y/0 esttica. Esttica: en tiempo de compilacin Dinmica: en tiempo de ejecucin.

Analizador Semntico
char a[5]; strcpy(a, abcdefghijk); Java es un lenguaje con un sistema de tipos ms fuerte que C/C++ que lo hace ms seguro pero a la vez un poco ms deficiente. Los lenguajes interpretados en el pasado eran ms susceptibles a errores en tiempo de ejecucin pero las cosas han cambiado.

Analizador Semntico
En general la tabla de smbolos debe contener la siguiente estructura para validar la parte semntica: Smbolo { nombre; tipo; mbito; }

Verificacin de tipos
La verificacin de los tipos de datos se hace asignando el valor de tipo de cada una de los componentes lxicos. Estos valores se comparan para verificar que los tipos de datos coincidan y sean congruentes, de lo contrario no se pueden realizar los clculos.

Conversin 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 conversin de tipos; lo que se denomina conversin automtica. A la conversin de tipos se le llama coercin o casting.

Conversin de Tipos
Esto slo es posible en algn lenguaje de programacin, si el compilador reconoce que la variable destino tiene la suficiente precisin 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 precisin que el primero.

Conversin de Tipos
A esto se le llama ensanchamiento o promocin, dado que el tipo ms pequeo se ensancha o promociona al tipo compatible ms grande. Si por el contrario, se desea asignar un valor de variable int a una variable byte se necesita realizar una conversin de tipos explcita.

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

Conversin de tipos
A esto se le llama estrechamiento, dado que se estrecha explcitamente el valor para que quepa en el destino. La conversin de un tipo se realiza poniendo delante un nombre de tipo entre parntesis, por ejemplo, (tipo) valor.

Ejemplos de coercin: byte a; int b; a=(byte) b;

Comprobacin de Tipos
Existen dos tipos de comprobacin: esttica y dinmica. La comprobacin ayuda a evitar la mayora de los errores de programacin. Ejemplos de comprobacin de tipos: Para saber si el operador aplicado a los operadores es correcto.

Comprobacin de Tipos
Comprobacin de flujo de control. Se debe verificar que las instrucciones que cambia el flujo de un programa sean vlidos. Ejemplo: break, goto.

Comprobacin de unicidad: definir un objeto una sola vez. Comprobacin relacionadas con nombres. El mismo nombre debe aparecer dos veces. Variables que se declaran pero no utilizan

Comprobacin de Tipos
La comprobacin de tipos es la ms complicada. Las dems comprobaciones son rutinarias. El operador % ocupa que los dos operandos sean enteros. + es una funcin suma(a,b) que est sobrecargada para distintos tipos de datos

Comprobacin de Tipos
Diferenciar el uso de +, * enteros que con punteros (aritmtica de punteros) Al conjunto de reglas que se definen para la comprobacin de los tipos de datos se denomina sistema de tipos La mayora de veces la recuperacin de errores se suele omitir ya que el programa no finaliza pero tal vez no obtenga los valores deseados

Comprobacin de Tipos
Generalmente en la etapa de anlisis sintctico se suelen agregar los tipos a la tabla de smbolos. Se revisa el rbol sintctico para comprobar los tipos asignados. Existen conversiones explcitas en las cuales el usuario indica el tipo de datos: a = (int)(23.3/18.2);

Comprobacin de Tipos
Las conversiones implcitas requieren de mayor tiempo de ejecucin. Un ciclo de nanosegundos implcitas. 1 a N tard5.4 y 48.4 utilizando conversiones

Polimorfismo: una funcin puede tener el mismo nombre con diferentes elementos. El tipo de datos debe ser diferente.

Comprobacin de Tipos
Un ejemplo de polimorfismo son las plantillas en algn lenguaje de programacin. Se debe considerar el mbito de las variables (locales y globales).

Prctica 10
Realizar un parser en Java para documentos en XML. Se debe de validar archivos del lenguaje clima visto previamente Cmo se realiza el anlisis sintctico en XML? Cmo se puede manejar el anlisis lxico?

Parser DOM en Java


Clases DocumentBuilderFactory Clase DocumentBuilder Clase Document Mtodo parser Anlisis utilizando implementacin de DOM a travs de todo el documento como si fuera un rbol.

Acciones Agregadas a Parsers


Muchas de las actividades que realiza un analizador semntico no son estndares, dependern del objetivo del lenguaje de programacin; por ejemplo, en algunas aplicaciones es interesante conocer que los datos estn en algn rango vlido o que ciertos valores se utilicen para uso reservado.

En general los analizadores semnticos se llegan a realizar a travs de la modificacin de parsers.

Pila semntica en un ASem


La pila juega un papel fundamental en el desarrollo de cualquier analizador semntico. Dentro de cada elemento de la pila se guardan los valores que pueden tener una expresin.

Admon. Tabla de Smbolos


La tabla de smbolos tambin recibe el nombre de ambiente. Un ambiente contiene un conjunto de parmetros que slo son visibles en ese ambiente. La tabla de smbolos se mantiene durante todo el proceso de traduccin agregando elementos especficos en cada paso.

Tabla de smbolos
Funcionalidades bsicas:

Inserta(smbolo) Existe(nombre) Se agrega una primitiva ms: Tipo (nombre) El anlisis lxico crea la tabla de smbolos? No

Tabla de Smbolos
Cmo se agrega la semntica al analizador sintctico? Declaracin TIPO {tipo=obtengo(yytext());} listavar PYC listavar var {inserta(simbolo);} {inserta(smbolo);} | var

var ID {simbolo=yytext; smbolo.tipo=tipo; simbolo.amb=ambito;}

Tabla de Smbolos
Exprlog 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; }

int a;

a = (int) 10.1;

Manejo Errores Semnticos


Algunos problemas se presentan durante la fase de gestin de memoria al pasar argumentos o al crear la pila semntica. Muchos errores se generan durante la etapa del enlazador, al tratar de obtener cdigo existente de algunas funciones/mtodos ya implementadas en bibliotecas/APIs

Examen
Analizador semntico que permita construir objetos de java con el siguiente sistema de tipos: Validar unicidad (se deben paquetes para poderse repetir) de manejar

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

Examen
Si se desea realizar operaciones aritmticas se deber mantener el sistema de compatibilidad de promocin hacia la clase base ms alta (utilizando herencia).

Si se trata de igualdad debern de ser del mismo tipo tanto lado derecho como el izquierdo o bien realizar la conversin explicita (coercin). Cuando sea de un tipo ms grande a uno pequeo se indicar un mensaje de advertencia.

Ejemplo examen
public 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;

Ejemplo Examen
Este programa devuelve lo siguiente:

Sintaxis correcta!!! Asignacin correcta Asignacin incorrecta Asignacin correcta (advertencia son mismo tipo padre pero diferentes clases)

del

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

Referencias

Preguntas?

You might also like