Está en la página 1de 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
operadores

de

tipos:

operandos-

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 de
unicidad? A travs de la tabla de
smbolos.

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
dinmica y/0 esttica.

puede

Esttica: en tiempo de compilacin


Dinmica: en tiempo de ejecucin.

ser

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
esttica y dinmica.

de

comprobacin:

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:
objeto una sola vez.

definir

un

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
operandos sean enteros.

que

los

dos

+ 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
comprobar los tipos asignados.

para

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 1 a N tard5.4 y 48.4
nanosegundos utilizando conversiones
implcitas.
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
documentos en XML.

en

Java

para

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
(nombre)

una

El anlisis
smbolos?
No

lxico

primitiva

crea

ms:

la

tabla

Tipo

de

Tabla de Smbolos
Cmo se agrega la
analizador sintctico?

semntica

al

Declaracin
TIPO
{tipo=obtengo(yytext());} listavar PYC
listavar var {inserta(smbolo);} | var
{inserta(simbolo);}
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 de manejar
paquetes para poderse repetir)
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 del
mismo tipo padre pero diferentes clases)

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?

También podría gustarte