Vous êtes sur la page 1sur 51

Anlisis Semntico

Lenguajes y Autmatas II

Conjunto de reglas que especifican el significado


de cualquier sentencia sintcticamente correcta y
escrita en un determinado lenguaje.

Ejemplos de errores semnticos en un lenguaje:


Conversiones de tipos no permitidas.
Variables usadas y no definidas.
Operandos de tipos no compatibles.

La sintaxis de un lenguaje de programacin es


aquella parte del lenguaje que puede ser
descrita mediante una gramtica libre de
contexto, mientras que el anlisis semntico es
la parte de su especificacin que no puede ser
descrita por la sintaxis.

Ejemplos
Comprobaciones llevadas por el analizador
semntico:
Declaracin de identificadores y reglas de mbito.
Comprobaciones de unicidad
Comprobaciones de enlace

Compilador
Front-end
Analiza un programa fuente y crea un
representacin intermedia
Detalle del lenguaje

Back-end
Genera el cdigo destino
Detalles de la mquina

Estructura lgica bsica


de un compilador

Comprobacin esttica:
Comprobacin de tipos.
Operandos
operador

Comprobacin sintctica.

Representaciones intermedias
rboles sintcticos
Cdigo de tres direcciones
x = y op z

Comprobacin de Enlace
En un lenguaje de programacin el empleo de
un elemento ha de estar ligado a una utilizacin

previa del mismo

COMPROBACIN DE UNICIDAD

En un lenguaje de programacin existen muchos


elementos cuyas entidades han de prevalecer de
un modo nico, es decir, no se permiten que
estn duplicadas.

Comprobacin esttica
Este tipo de verificaciones se lleva a cabo en
tiempo de compilacin.

Comprobacin dinmica
Este tipo de comprobaciones se llevan a cabo en
tiempo de ejecucin.

COMPROBACIN DE TIPO
Verifica las operaciones que se pueden aplicar a
cada construccin del lenguaje e infiere el tipo
de construccin de cada lenguaje.

RBOL SINTCTICO
Es la representacin de la estructura de una
consecucin de componentes lxicos, en la que
stos aparecen como como nodos hoja y los
nodos internos representan los pasos en las
derivaciones de la gramtica asociada

RBOL DE SINTAXIS ABSTRACTA


Es la representacin de toda la informacin
necesaria de una gramtica para el
procesamiento de un programa de manera ms
eficiente.

RBOL DE SINTAXIS ABSTRACTA


ANOTADO
Es la representacin de toda la informacin
necesaria de una gramtica en la que a cada
nodo del mismo se le aaden atributos
indicando las propiedades necesarias de la
construccin sintctica que representan.

Un compilador puede generar la cantidad de


representaciones intermedias necesarias.
Se clasifican en representaciones de alto nivel y bajo nivel.

Los rboles sintcticos


son una representacin
de alto nivel.

El cdigo de tres direcciones


puede variar de alto a bajo
nivel, dependiendo del uso de
operadores.

Cul es la diferencia entre un rbol


sintctico y el cdigo de tres direcciones?
Ejemplo
En las instrucciones de ciclos, un rbol sintctico
representa a los componentes de una instruccin.
El cdigo de tres direcciones contiene etiquetas e
instrucciones de salto para representar el flujo de
control.

La representacin intermedia puede ser un


lenguaje existente o estructuras de datos
internas.
Ejemplo:
C es un lenguaje de programacin que se
utiliza como un medio para generar la
representacin intermedia.
El compilador de C++ generaba cdigo
intermedio en C.

Atributos y acciones semnticas


En el anlisis sintctico, gracias a las gramticas, se pueden
producir los rboles sintcticos.

El orden en que se aplican las reglas de produccin tiene una


estrecha relacin con la semntica.
A los terminales y no terminales, se les puede asociar
informacin que sirva para el anlisis semntico.
En el caso de los terminales, se les asignarn esa informacin,
a travs de una accin asociada al patrn definido en el
anlisis lxico.

Atributo. Informacin asociada a un termino o


a un no terminal.
Los atributos se asocian a los smbolos
gramaticales que representan en la
construccin.
Accin o regla semntica. Algoritmo que
puede acceder a los atributos de los
terminales y/o no terminales.

Ejemplo:
Suponga una entrada como:
3*2*1
El analizador lxico:
Evala la cadena de entrada, y al reconocer el patrn,
convierte cada lexema en un componente lxico.
La entrada es: 3 * 2 * 1
Despus del anlisis lxico:
num * num * num

El orden en el que se aplican las reglas de


produccin tiene una relacin estrecha con la
semntica del lenguaje.
A los terminales se les asignarn valores, es decir
atributos, a travs de acciones asociadas al
patrn que define al componente lxico.
Con esta funcionalidad, el resultado del anlisis
lxico sera:

num.3

*.vaco

num.2

*.vaco

num.1

Suponga la siguiente gramtica:


Producciones
E -> E + T
E -> T
T -> T * F
T -> F
F -> (E)
F -> num

Reglas semnticas
{E1 = E2 + T;}
{E = T;}
{T1 = T2 * F;}
{T = F;}
{F = E;}
{F = num ;}

Se agregarn acciones semnticas asociadas a


cada una de las reglas de produccin de la
gramtica.

El analizador sintctico, recibe una expresin


compuesta por componentes lxicos, acompaados de
atributos.
Cada vez que se reduzca sintcticamente a travs de
una regla de produccin, se ejecutar la accin
semntica.
Las acciones semnticas se puede definir como
algoritmos que puede acceder a los atributos de los
terminales y no terminales.

Dichas acciones semnticas, puede ser cualquier tipo


de cdigo necesario para manipular la informacin
contenida en los atributos.

Las reglas o acciones semnticas asociadas,


NO modifican la gramtica.

Al momento de construir el rbol sintctico,


con las reglas de produccin y ejecutando las
acciones semnticas, y aplicando una
propagacin de atributos, en algunos casos, se
puede obtener el valor final de ciertas
operaciones.

rbol sintctico con propagacin de atributos de las hojas haca la raz.

Traduccin dirigida por sintaxis

Ejecucin de una accin semntica


Hay dos formas de asociar reglas semnticas con reglas de
produccin:

Definiciones dirigidas por la sintaxis


Se indican los valores de los atributos mediante la asociacin de
reglas semnticas con las producciones gramaticales.

Esquemas de traduccin
Se insertan fragmentos de programa, llamados acciones
semnticas.
Las acciones semnticas se pueden situar en cualquier posicin
dentro del cuerpo de una produccin, determinando el orden
en el que se ejecuta la accin.

Definiciones dirigidas por la sintaxis


Gramtica libre de contexto, smbolos
gramaticales, atributos y reglas semnticas.
Atributos:
Sintetizados. El valor del atributo sintetizado de un
nodo, se calcula a partir de los valores de los atributos
de sus nodos hijos en el rbol sintctico.
Heredados. El valor del atributo heredado se calcula a
partir de los valores de los atributos en los nodos
hermanos y padre.

Consideraciones en la definicin dirigida por


sintaxis:
Los terminales slo tienen atributos
sintetizados, ya que la definicin no
proporciona ninguna regla semntica para los
terminales.
El smbolo inicial no tiene ningn atributo
heredado, a menos que se indique lo
contrario.

Definicin con atributos sintetizados


Definicin dirigida por sintaxis que usa solamente
atributos sintetizados.
Cada regla calcula un atributo para el no terminal
en el encabezado de la produccin, a partir de los
atributos que se toman en el cuerpo de la
produccin.

Se puede implementar en conjuncin con un


analizador sintctico LR.

Evaluacin de una definicin dirigida por la sintaxis en


los nodos de un rbol de anlisis sintctico.

Construir el rbol sintctico.


Aplicar reglas para evaluar todos los atributos
en cada uno de los nodos.
El orden de evaluacin puede realizarse en
cualquier orden de abajo hacia arriba.
Un rbol sintctico que muestra los valores de
sus atributos se le conoce como rbol de anlisis
sintctico anotado.

Definicin dirigida por la sintaxis, utilizando


atributos sintetizados y heredados.
T -> F T

T.her = F.val
T.val = T.sin

T -> * F T1

T 1.her = T.her * F.val


T.sin = T1.sin

T ->

T.sin = T.her

F -> digito

F.val = digito.valor

rdenes de evaluacin para las


definiciones dirigidas por la sintaxis
Grafos de dependencia
Herramienta que ayuda a determinar el orden de
evaluacin para las instancias de los atributos en
un rbol de anlisis.
Un rbol sintctico anotado muestra los valores de
los atributos y un grafo de dependencias ayuda a
determinar cmo pueden calcularse esos valores.

Grafos de dependencias
Flujo de informacin entre las instancias de
atributos en un rbol de anlisis sintctico.
La flecha de una instancia de un atributo a otro,
significa que el valor de la primera se necesita
para calcular la segunda.
Las flechas expresan las restricciones que
imponen las reglas semnticas.

Orden de evaluacin
El grafo de dependencias caracteriza los
rdenes posibles en los cuales se puede
evaluar los atributos en los diversos nodos de
un rbol de anlisis sintctico.
El ordenamiento que se incrusta en un grafo
dirigido es un orden lineal, a lo cual se le
conoce como orden topolgico del grafo.

Definiciones con atributos sintetizados


Las traducciones pueden implementarse mediante el
uso de clases de definiciones dirigidas por la sintaxis
que garanticen un orden de evaluacin, ya que no
permiten grafos de dependencias con ciclos.
Cuando una definicin dirigida por la sintaxis tiene
atributos sintetizados, el orden de evaluacin es de
abajo hacia arriba.
En la prctica, la evaluacin se puede realizar mediante
una funcin postorden.

La definiciones de los atributos sintetizados


pueden implementarse durante el anlisis
sintctico ascendente.
El postorden corresponde al orden en que un
analizador LR reduce el cuerpo de una
produccin a su encabezado.

Definiciones con atributos heredados


Valores que se heredan del padre a los hijos,
y
entre hermanos, atributos heredados por la
izquierda. Se implementan en anlisis sintcticos LL.
1. Sintetizado
2. Heredado
Atributos asociados a la parte izquierda de la regla
de produccin
Atributos heredados o sintetizados ubicados a la
izquierda (hijos del mismo padre)
En el grafo de dependencias no existan ciclos.

Esquemas de traduccin orientados


por la sintaxis
Notacin complementaria para las
definiciones dirigidas por la sintaxis.
Es una gramtica libre de contexto, con
fragmentos de programa incrustados dentro de
los cuerpos de las producciones.
Acciones semnticas se encierran entre llaves o
comillas.

Implementacin
Se implementan durante el anlisis sintctico.
Construir un rbol sintctico
Realizar las acciones semnticas en un orden
de izquierda a derecha, con un recorrido
preorden.

Comprobacin de Tipos
Asegura de que el tipo de construccin
coincida con el previsto en su contexto.
Se puede implementar una funcin encargada
de comprobacin de tipos que se encontrara
despus del analizador sintctico y antes del
generador de cdigo intermedio.

Sistemas de Tipos
El diseo de un comprobador de tipos para un
lenguaje se basa en informacin acerca de las
construcciones sintcticas del lenguaje, la
nocin de tipos y las reglas para asignar tipos
a las construcciones del lenguaje.

Ejemplo
Si ambos operandos de los operadores
aritmticos de suma, sustraccin y
multiplicacin son de tipo entero, entonces el
resultado es de tipo entero.

Expresiones de tipos
El tipo de una construccin de un lenguaje se
denotar mediante una expresin de tipo.
Tipo bsico: es una expresin de tipo y un tipo
bsico especial error_tipo.
Constructores bsicos: pueden ser matrices,
productos, registros, objetos, apuntadores,
funciones, entre otros.

Sistema de tipos
Serie de reglas para asignar expresiones de
tipos a las distintas partes de un programa.
Se encuentra contenido en comprobador de
tipos.

Consideraciones especficas de cada lenguaje.

Comprobacin esttica y
dinmica de tipos
Compilador esttica
Ejecuta el programa objeto dinmica
Cualquier verificacin se puede realizar
dinmicamente, si el cdigo objeto carga el
tipo de un elemento junto con el valor de
dicho elemento.

Ejercicio - Binas
Considere la siguiente gramtica:
L -> E
E -> E1 + T
E -> T
T -> T1 * F
T -> F
F -> (E)
F -> digito

L.val = E.val
E.val = E1.val + T.val
E.val = T.val
T.val = T1.val * F.val
T.val = F.val
F.val = E.val
F.val = digito.lexval

Ejercicio - Binas
Considere la siguiente gramtica:
D -> T L

L.her = T.tipo

T -> int

T.tipo = integer

T -> float

T.tipo = float

L -> L1, id

L1.her = L.her
Agregar(id.entrada,L.her)

L -> id

Agregar(id.entrada,L.her)

Vous aimerez peut-être aussi