Вы находитесь на странице: 1из 59

ANALIZADOR

SEMANTICO
El anlisis semntico dota de un significado coherente a lo que
hemos hecho en el anlisis sintctico.

El chequeo semntico se encarga de que los tipos que


intervienen en las expresiones sean compatibles o que los
parmetros reales de una funcin sean coherentes con los
parmetros formales.
Se asocia informacin a las construcciones del lenguaje de
programacin proporcionando atributos a los smbolos de la
gramtica
El anlisis semntico incluye:

La construccin de la Tabla de Smbolos para llevar un


seguimiento del significado de los identificadores en el
programa
Realizar la comprobacin e inferencia de tipos en
expresiones y sentencias
FUNCIONES DEL ANALIZADOR SEMANTICO
Identificar cada tipo de instruccin y sus
componentes.
Completar la Tabla de Smbolos.
Realizar distintas comprobaciones y validaciones:
Comprobaciones de unicidad: Existen multitud de
elementos en lenguajes de programacin cuyas entidades
han de existir de un modo nico, es decir, no se permite que
estn duplicadas.

Comprobaciones dinmicas: Estas suelen ser


comprobadas por un intrprete o por cdigo de
comprobacin generado por el compilador tambin puede
darse el caso de que no se comprueben.
Comprobaciones de tipos: este tipo de comprobaciones
es el ms exhaustivo y amplio en fase de anlisis
semntico.

El proceso de compilacin se divide en dos fases: anlisis y


sntesis.
La fase de sntesis construye y optimiza el programa objeto
deseado partiendo de la representacin intermedia
generada en la fase de anlisis.

El Analizador Semntico finaliza la fase de Anlisis del


compilador y comienza la fase de Sntesis, en la cual se
comienza a generar el cdigo objeto.
ANLISIS SINTCTICO: La estructura empleada para
intercambiar la informacin entre estas dos fases es lo que se
conoce como rbol sintctico abstracto. Una vez validada la
sintaxis de un programa, el anlisis semntico aplicar reglas
semnticas para validar dicho rbol.
MANEJADOR DE ERRORES: Si la validacin del rbol
sintctico no fuese satisfactoria, la fase de anlisis semntico
debera notificar dicho error al manejador de errores para que
ste se encargase de su gestin.
GENERACIN DE CDIGO (INTERMEDIO): La estructura de
datos empleada para intercambiar informacin entre las dos fases
mencionadas es un rbol sintctico decorado. Este rbol posee
informacin adicional al rbol generado por el analizador
sintctico.
OPTIMIZACION DE CODIGO: En esta fase se intenta mejorar el
cdigo, en el sentido de reducir la cantidad de recursos (tiempo y
memoria) necesarios.
GENERADOR DE CODIGO: Esta fase recibe a la entrada un
programa en un lenguaje intermedio (cdigo de pila, de tres
direcciones, estructurado como rbol, etc.) y emite cdigo de
mquina para una maquina objetivo (cdigo objeto).
La especificacin de la semntica puede realizarse de dos formas:
Lenguaje natural
Especificacin formal: Semntica Operacional, semntica
denotacional, semntica Axiomtica, Gramticas con
Atributos.
SEMNTICA OPERACIONAL: Los significados del programa
son descritos en trminos de operaciones, utilizando un
lenguaje basado en reglas de inferencia lgicas en las que se
describen formalmente las secuencias de ejecucin de las
diferentes instrucciones sobre una mquina abstracta.
SEMNTICA DENOTACIONAL: La representacin del
comportamiento de cada sentencia o frase del lenguaje se
lleva a cabo mediante entidades matemticas (denotacin)
que representan el efecto de haber ejecutado la sentencia o
la frase asociada.
SEMNTICA AXIOMTICA: Especifica las propiedades del
efecto de ejecutar las sentencias sintcticamente correctas,
expresadas mediante asertos, desoyendo as los aspectos de
su ejecucin.
GRAMTICAS CON ATRIBUTOS: Las gramticas atribuidas
asignan propiedades (atributos) a las distintas
construcciones sintcticas del lenguaje. Estos atributos
pueden describir informacin semntica para implementar
un analizador semntico (como por ejemplo el tipo de una
expresin).
ACCIONES SEMANTICAS
Sentencias de Declaracin: Completar la seccin de tipos
de la Tabla de Smbolos.
Sentencias ejecutables: Realizar comprobaciones de tipos
entre los operandos implicados.
Funciones y procedimientos: Comprobar el nmero, orden
y tipo de los parmetros actuales en cada llamada a una
funcin o procedimiento.
Identificacin de variables: Comprobar si un identificador
ha sido declarado antes de utilizarlo.
Etiquetas: Comprobar si hay etiquetas repetidas y
validacin.
Constantes: Comprobar que no se utilicen en la parte
izquierda de una asignacin.
Conversiones y equivalencias de tipo: Verificacin.
Sobrecarga de operadores y funciones: Detectar y
solventar.
Cmo vamos a implementar la
estructura semntica de un lenguaje?
Recorreremos en orden y calcularemos en cada
nodo la informacin semntica.
Se analiza sintcticamente la cadena de componentes
lxicos de entrada.
Se construye el rbol de anlisis sintctico.
Se recorre el rbol, en un determinado orden para
tener en cuenta las dependencias.
Evaluar las reglas semnticas en sus nodos.
RELACIN CON
EL ANLISIS GRAMATICAL
ASCENDENTE Y DESCENDENTE
ANLISIS GRAMATICAL
ASCENDENTE

*Construye el rbol de
anlisis sintctico de las
hojas a la raz.
1.- DE ABAJO ARRIBA (BOTTOMUP):

Es una tcnica que pretende construir un rbol sintctico para una


determinada cadena de entrada empezando por las hojas y
construyendo el rbol hasta llegar a la raz.

Si la palabra reduccin se considera el proceso inverso a la derivacin,


es decir, sustituir una sub-cadena que coincida con el lado derecho de
una produccin por un smbolo no terminal de la izquierda, se puede
considerar que este mtodo de anlisis realiza la reduccin de la cadena
c de entrada hasta convertirla en el smbolo inicial S de la gramtica.

El resultado final coincide con una derivacin por la derecha de la


cadena de entrada pero escrita en orden contrario.
A continuacin, se muestran las dos formas de aplicar la
derivacin en una cierta gramtica cuando entra una cadena de
smbolos. Los ejemplos que se realizan en cada uno de los
apartados se hacen con la gramtica que se muestra a
continuacin
2.- DERIVACIN POR LA DERECHA:

La derivacin por la derecha reside en que siempre se sustituye


primero el no terminal que se encuentra ms a la derecha. Y el
rbol se construye desde las hojas, hasta llegar a la raz. Se puede
ver una evidencia en el siguiente ejemplo:
ANLISIS GRAMATICAL
DESCENDENTE

*Construye un rbol de
anlisis sintctico de la raz a
las hojas
1.- DE ARRIBA ABAJO (TOPDOWN):

Es una tcnica que intenta construir un rbol sintctico de la


cadena de entrada, comenzando por la raz y creando los nodos
a partir de ella hasta llegar a las hojas. Asimismo, se puede
pensar como un mtodo que intenta encontrar una derivada
ms a la izquierda de la cadena de entrada.
2.- DERIVACIN POR LA IZQUIERDA:

La derivacin por la izquierda cosiste en reemplazar siempre


el no terminal que se encuentra ms a la izquierda primero.
En el siguiente ejemplo se puede ver una demostracin.
El anlisis semntico est dirigido por la sintaxis, ya que es el
analizador sintctico el que va invocando las rutinas al analizador
semntico cuando las va necesitando.

As pues, el compilador verifica la coherencia semntica de un


programa y a la vez lo traduce al lenguaje mquina o a una versin
intermedia.
Una vez realizado el anlisis lxico y sintctico, el analizador
semntico recibe como entrada el rbol sintctico del programa.

El anlisis semntico genera como salida, en el caso de no


detectar errores, un rbol sintctico con anotaciones semnticas o
atributos.

Estos atributos se emplean para comprobar que el programa es


semnticamente correcto.
Para que los smbolos de una gramtica pueden adquirir significado,
se les asocia informacin (atributos) y a las producciones
gramaticales se les asocian acciones semnticas, que sern cdigo en
un lenguaje de programacin y cuya tarea es evaluar los atributos y
tratar dicha informacin para llevar a cabo las tareas de traduccin.

Por este motivo, las gramticas libres de contexto no son suficientes


para realizar el anlisis semntico. Es necesario, por tanto, definir un
tipo de gramtica ms rica, como las gramticas de atributos.
EL ANLISIS SEMNTICO UTILIZA COMO ENTRADA EL RBOL
SINTCTICO DETECTADO POR EL ANLISIS SINTCTICO PARA
COMPROBAR RESTRICCIONES DE TIPO Y OTRAS LIMITACIONES
SEMNTICAS Y PREPARAR LA GENERACIN DE CDIGO.
REGLAS SEMANTICAS

Las reglas semnticas vienen dadas en funcin de los atributos de los


dems smbolos que componen la regla. La evaluacin de las reglas
semnticas puede generar cdigo, guardar informacin en una tabla de
smbolos, emitir mensajes de error o realizar otras actividades.

TABLA DE SIMBOLOS

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

Propiedades de los smbolos del lenguaje que almacenan contenidos relacionados


con el significado de los smbolos a los que pertenecen.

Se utiliza la notacin simbolo.atributo:


*id.lexema L:= , id L1 L.Trad := "," || id.lexema ||
*Var.valor L1.Trad
*Expo.codigo

Se utilizan subndices para diferenciar smbolos.


Analizador Semntico.

Verifica que el significado de las construcciones del lenguaje tengan sentido.

Tareas del analizador semntico:


Comprobacin de Tipos.
Comprobacin de parmetros.
Generacin de cdigo intermedio.

Ejemplo:
A : float ; B
: string ;

A := B + 5 ;
Analizador Lxico.
id1 :float;
id2 : string ;

id1 := id2 op num ;


Analizador Sintctico.
:=

A +

B 5
Analizador Semntico
Hasta aqu la entrada es lxica y sintcticamente valida, ahora se analiza desde el
punto de vista semntico:

cadena + entero = ERROR_TIPO


GRAMTICA DE ATRIBUTOS

Las gramticas libres de contexto se amplan para poder definir la semntica de un


lenguaje de programacin. La gramtica de atributos, es una tripleta (G, A, R)
donde:
G, es una gramtica libre de contexto G= (T, N, S, P).
Cada smbolo de la gramtica S, ya sea terminal como no terminal tiene asociado
un conjunto finito de atributos A, y cada atributo un conjunto de valores. Por
ejemplo, la especificacin X(a, b, c), seala que el no terminal X, tiene tres atributos
a, b, y c.
Cada produccin puede tener asociada una serie de acciones R, que indican cmo
calcular los valores de los atributos en funcin de los valores de los atributos de los
nodos vecinos.
Cada smbolo no terminal tiene asociado tres campos, el
nombre del smbolo nom, el tipo del smbolo tipo y el valor
del atributo val. Los smbolos terminales, tienen tres
campos, el nombre del smbolo lexnom, el tipo del smbolo
lextipo y el valor del atributo lexval, ya que se obtienen del
analizador lxico. Se muestra un pequeo ejemplo, donde
se escribe por pantalla el valor del atributo del smbolo E1
y T.
E1 - > E2 + T {cout.print(E1.val,
T.lexval)}
TIPOS DE ATRIBUTOS

ATRIBUTOS ATRIBUTOS
SINTETIZADOS HEREDADOS

Se calculan a partir de Se calculan a partir de


los valores de atributos los valores de
de los nodos hijos en atributos del nodo
cualquier subrbol que padre o de los nodos
aparezcan. hermanos.
SISTEMAS DE
TIPOS
DEFINICIN:

Un sistema de tipos es una serie de reglas para asignar


expresiones de tipos a las distintas partes de un programa
y verificar su correccin. En concreto, formarn el sistema
de tipos las definiciones y reglas que permiten
comprobar cul es el dominio asignado a una variable, y
en qu contextos puede ser usada.
EXPRESIONES DE TIPO

El tipo de una construccin de un lenguaje se denotar mediante una expresin de


tipo. De manera informal, una expresin de tipo es, o bien un tipo bsico o se
forma aplicando un operador llamado constructor de tipos a otras expresiones de
tipos
TIPOS SIMPLES

Son expresiones de tipos los tipos simples del lenguaje, y algunos tipos
especiales:

Integer
Real
Char
Boolean
CONSTRUCTORES DE TIPOS

Permiten formar tipos complejos a partir de otros ms simples. La semntica de


cada lenguaje tiene asociada unos constructores de tipos propios

Matrices
Productos
Registros
Punteros
Funciones
COMPROBACIONES DE TIPOS
Un aspecto importante del anlisis semntico es la comprobacin de los tipos de las
expresiones. Esta comprobacin se hace con un doble objetivo:
Detectar posibles errores
Averiguar el operador o funcin correcto en casos de sobrecarga
y polimorfismo.
Para representar los tipos en el compilador, se emplean lo que se denominan
expresiones de tipo (ET). La definicin de estas expresiones es generalmente
recursiva. Un ejemplo sera:
Los tipos bsicos: real, entero, . . ., adems de los tipos especiales error de tipo y
ausencia de tipo (void) son ETs.
Si n1 y n2 son enteros, rango(n1, n2) es una ET.
Si T es una ET, tambin lo es puntero(T).
Si T1 y T2 son ETs, tambin lo es T1 ! T2.
Si T1 y T2 son ETs, tambin lo es vector(T1, T2).
Si T1 y T2 son ETs, tambin lo es T1 T2.
Si T1,. . . ,Tk son ETs y N1,. . . ,Nk son nombres de campos, registro((N1, T1), . .
. , (Nk, Tk)) es una ET.
Se debe tener en cuenta que, segn los lenguajes, estas definiciones
cambian. Es ms, los lenguajes pueden restringir que expresiones realmente
resultan en tipos vlidos para los programas (por ejemplo, en Pascal no se
puede definir un vector de funciones).
Algunos ejemplos de declaraciones y sus expresiones correspondientes
seran:
Equivalencia de tipos

Comprobar si dos expresiones de tipo, T1 y T2, son equivalentes es muy


sencillo. Si ambas corresponden a tipos elementales, son equivalentes si
son iguales. En caso de que correspondan a tipos estructurados, hay que
comprobar si son el mismo tipo y si los componentes son equivalentes.
En muchos lenguajes se permite dar nombre a los tipos. Esto introduce
una sutileza a la hora de comprobar la equivalencia.

Existen dos criterios para la equivalencia:

Equivalencia de nombre: dos expresiones de tipo con nombre son


equivalentes si y slo si tienen el mismo nombre.
Equivalencia estructural: dos expresiones de tipo son equivalentes si
y slo si tienen la misma estructura.
Comprobacin de tipos en expresiones

Para comprobar los tipos en las expresiones podemos utilizar un


atributo que indique el tipo de la expresin. Este tipo se infiere a partir
de los distintos componentes de la expresin y de las reglas de tipos
del lenguaje.
A la hora de calcular el tipo hay varias opciones: podemos calcularlo
sobre la gramtica, sobre el AST o al construir el AST. En cualquier caso,
puede ser til tener una funcin que refleje las peculiaridades de los tipos
del lenguaje.
El clculo de atributos de tipo debera ser trivial sobre la gramtica o sobre el AST. En
cuanto al clculo al construir el AST, se puede, por ejemplo, hacer que el constructor
compruebe los tipos de los componentes que recibe. En este caso, si es necesario,
se puede aadir un nodo de promocin de tipos. Por ejemplo, si vamos a crear un
nodo suma a partir de los arboles:
Equivalencia Estructural y funcional:
1. Equivalencia estructural:
cuando se trata del mismo tipo bsico.
aplicacin de un mismo constructor a tipos estructuralmente equivalentes.
Ejemplo:
type
tipovector = array [0..5] of real;
tipomatriz = array [0..5] of array [0..5] of real;
var
vector : array [0..5] of real;
array1 : array [0..5,0..5] of real;
matriz : tipomatriz;
vecvec1 : array [0..5] of tipovector;
vecvec2 : array [0..5] of tipovector;
1. array1, matriz, vecvec1 y vecvec2 su expresin de tipos
es
a).array(0-5,array(0-5,real))
2.vector . Expresin de tipos:
b). array(0-5,real)
Ejemplo de un Algoritmo para Comprobar Equivalencia
Estructural

Eq_Est (s, t) :
Si s y t son del mismo tipo bsico
Retorne Verdadero
Sino Si s = arreglo(s1, s2) y t = arreglo(t1, t2)
Retorne Eq_Est(s1, t1) y Eq_Est(s2, t2)
Sino Si s = apuntador(s1) y t = apuntador(t1)
Retorne Eq_Est(s1, t1)
Sino
Retorne Falso
Equivalencia funcional:

Dos tipos se consideran equivalentes funcionalmente cuando


pueden emplearse indistintamente en un mismo contexto.
Ejemplo:
los tipos de A y de B son funcionalmente
equivalentes:
void Ordenar (int mat[], int n){ /* ... */ }
int A[10], B[20];
Ordenar(A,10);
Ordenar(B,20);
Conversiones de Tipos

Las reglas del lenguaje definen que conversiones son necesarias


Al generar cdigo intermedio se pueden introducir las conversiones de tipo necesarias
Coacciones: conversiones de tipo implicitas (realizadas por el compilador). Generalmente
se realizan en los casos en que no se pierde informacin.
Conversiones Explicitas: cuando el programador causa la conversin escribiendo una
instruccin.
Las coacciones se deben tener en cuenta al escribir las reglas semnticas para
comprobacin de tipos del compilador.
errores semnticos Los errores semnticos corresponden a la semntica del
lenguaje de programacin, la cual normalmente no est descrita por la gramtica.
Los errores semnticos ms comunes pueden ser :

Conversiones de tipos no permitidas


int x;
x = 4.32;
Variables usadas y no definidas
Operandos de tipos no compatibles
if (x || 5) x = 0;
Tratamiento errores semnticos

Comprobacion de tipos
Comprobaciones de flujo de control:
Comprobaciones de unicidad

Вам также может понравиться