Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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-
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();
Analizador Semntico
Cada analizador semntico implementa
un sistema de tipo (no necesariamente
tan robusto)
Comprobacin de tipos
dinmica y/0 esttica.
puede
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:
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 de Tipos
La comprobacin de tipos es la ms
complicada. Las dems comprobaciones
son rutinarias.
El operador % ocupa
operandos sean enteros.
que
los
dos
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
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
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.
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;
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?