Vous êtes sur la page 1sur 12

UNIDAD 4

EL ANLISIS SEMNTICO
OBJETIVO GENERAL: Analizar y aplicar la manera como trabaja el
compilador en la fase donde realiza el anlisis semntico para comprender la
forma de optimizar los procesos de ejecucin de diferentes programas y
aplicaciones.
OBJETIVOS EPECFICOS.
Conocer la forma que trabaja el analizador semntico de un compilador
Estudiar el anlisis semntico de los compiladores
Aplicar la manera lgica en el cual trabajan los analizadores semnticos
de los compiladores
En esta unidad analizamos la fase del compilador que calcula la informacin
adicional necesaria para la compilacin una vez que se conoce la estructura
sintctica de un programa. Esta fase se conoce como anlisis semntico
debido a que involucra el clculo de informacin que rebasa las capacidades
de las gramticas libres de contexto y los algoritmos de anlisis sintctico
estndar, por lo que no se considera como sintaxis. La informacin calculada
tambin est estrechamente relacionada con el significado final, o semntica,
del programa que se traduce. Como el anlisis que realiza un compilador es
esttico por definicin (tiene lugar antes de a ejecucin), dicho anlisis
semntico tambin se conoce como anlisis semntico esttico. En un lenguaje
tpico estticamente tipificado como C, el anlisis semntico involucra a
construccin de una tabla de smbolos para mantenerse al tanto de los
significados de nombres establecidos en declaraciones e inferir tipos y
verificarlos en expresiones y sentencias con el fin de determinar su exactitud
dentro de las reglas de tipos del lenguaje.
El anlisis semntico se puede dividir en dos categoras. La primera es el
anlisis de un programa que requiere las reglas del lenguaje de programacin
para establecer su exactitud y garantizar una ejecucin adecuada. La

complejidad de un anlisis de esta clase requerido por una definicin del


lenguaje vara enormemente de lenguaje a lenguaje. En lenguajes orientados
en forma dinmica, tales como LISP y Smalltalk, puede no haber anlisis
semntico esttico en absoluto, mientras que en un lenguaje como Ada existen
fuertes requerimientos que debe cumplir un programa para ser ejecutable.
Otros lenguajes se encuentran entre estos extremos (Pascal, por ejemplo, no
es tan estricto en sus requerimientos estticos como Ada y C, pero no es tan
condescendiente como LISP).
La segunda categora de anlisis semntico es el anlisis realizado por un
compilador para mejorar la eficiencia de ejecucin del programa traducido. Esta
clase de anlisis por lo regular se incluye en anlisis de optimizacin, o
tcnicas de mejoramiento de cdigo.
El anlisis semntico esttico involucra tanto la descripcin de los anlisis a
realizar como la implementacin de los anlisis utilizando algoritmos
apropiados. En este sentido, es semejante al anlisis lxico y sintctico. En el
anlisis sintctico, por ejemplo, utilizamos gramticas libres de contexto en la
Forma Backus-Naus (BNF, por sus siglas e ingls) para describir la sintaxis y
diversos algoritmos de anlisis sintctico descendente y ascendente para
implementar la sintaxis. En el anlisis semntico la situacin no es tan clara, en
parte porque no hay un mtodo estndar (como el BNF) que permita
especificar la semntica esttica de un lenguaje, y en parte porque la cantidad
y categora del anlisis semntico esttico vara demasiado de un lenguaje a
otro. Un mtodo para describir el anlisis semntico que los escritores de
compiladores usan muy a menudo con buenos efectos es la identificacin de
atributos, o propiedades, de entidades del lenguaje deben calcularse y escribir
ecuaciones de atributos o reglas semnticas, que expresan cmo el clculo de
tales atributos est relacionado con las reglas gramaticales del lenguaje. Un
conjunto as de atributos y ecuaciones se denomina gramtica con atributos
Las gramticas con atributos son ms tiles para los lenguajes que obedecen
el principio la semntica dirigida por sintaxis, la cual asegura que el contenido
semntico de programa se encuentra estrechamente relacionado con su
sintaxis. Todos los lenguajes modernos tienen esta propiedad. Por desgracia, el

escritor de compiladores casi siempre debe construir una gramtica con


atributos a mano a partir del manual del lenguaje, que rara vez la da el
diseador del lenguaje. An peor, la construccin de una gramtica con
atributos puede complicarse innecesariamente debido a su estrecha adhesin
con la estructura sintctica explcita del lenguaje. Un fundamento mucho mejor
para la expresin de los clculos semnticos es la sintaxis abstracta, como se
representa mediante un sintctico abstracto. Incluso, el diseador del lenguaje,
tambin suele dejar al escritor del compilador la especificacin de la sintaxis
abstracta.
Los algoritmos para la implementacin del anlisis semntico tampoco son tan
claramente expresables como los algoritmos de anlisis sintctico. De nuevo,
esto se de parte a los mismos problemas que se acaban de mencionar
respecto a la especifica del anlisis semntico. No obstante, existe un
problema adicional causado por la temporizacin del anlisis durante el
proceso de compilacin. Si el anlisis semntico se puede suspender hasta
que todo el anlisis sintctico (y la construccin de un rbol sintctico
abstracto) est completo, entonces la tarea de implementar el anlisis
semntico se vuelve considerablemente ms fcil y consiste en esencia en la
especificacin de orden par recorrido del rbol sintctico, junto con los clculos
a realizar cada vez que se encuentra un nodo en el recorrido. Sin embargo,
esto implica que el compilador debe ser de paso mltiple. Si, por otra parte, el
compilador necesita realizar todas sus operaciones en un solo paso
(incluyendo la generacin del cdigo), entonces la implementacin del anlisis
semntico se convierte en mucho ms que un proceso a propsito para
encontrar un orden correcto y un mtodo para calcular la informacin
semntica (suponiendo que un orden correcto as exista en realidad).
Afortunadamente, la prctica moderna cada vez ms permite al escritor de
compiladores utilizar pasos mltiples para simplificar los procesos de anlisis
semntico y generacin de cdigo.
A pesar de este estado algo desordenado del anlisis semntico, es muy til
para estudiar gramticas con atributos y cuestiones de especificacin, ya que
esto redundar en la capacidad de escribir un cdigo ms claro, ms conciso y

menos proclive a errores para anlisis semntico, adems de permitir una


comprensin ms fcil de ese cdigo.
Por lo tanto, la unidad comienza con un estudio de atributos y gramticas con
atributos. Contina con tcnicas para implementar los clculos especificados
mediante una gramtica con atributos, incluyendo la inferencia de un orden
para los clculos y los re corridos del rbol que los acompaan. Dos secciones
posteriores se concentran en las reas principales del anlisis semntico:
tablas de smbolos y verificacin de tipos. La ltima seccin describe un
analizador semntico para el lenguaje de programacin TINY presenta do en
captulos anteriores.
A diferencia de las unidades previas, esta unidad no contiene ninguna
descripcin de un generador de analizador semntico ni alguna herramienta
general para construir analizadores semnticos. Aunque se han construido
varias de tales herramientas, ninguna ha logrado el amplio uso y disponibilidad
de Lex o Yacc.
ATRIBUTOS Y GRAMTICAS CON ATRIBUTOS
Un atributo es cualquier propiedad de una construccin del lenguaje de
programacin. Los atributos pueden variar ampliamente en cuanto a la
informacin que contienen, su complejidad y en particular el tiempo que les
torna realizar el proceso de traduccin/ejecucin cuando pueden ser
determinados. Ejemplos tpicos de atributos son
El tipo de datos de una variable
El valor de una expresin
La ubicacin de una variable en la memoria
El cdigo objeto de un procedimiento
El nmero de dgitos significativos en un nmero
Los atributos se pueden establecer antes del proceso de compilacin (o incluso
la construccin de un compilador). Por ejemplo, el nmero de dgitos

significativos en un nmero se puede establecer (o por lo menos dar un valor


mnimo) mediante la definicin de un lenguaje. Adems, los atributos slo se
pueden determinar durante la ejecucin del programa, tal como el valor de una
expresin (no constante), o la ubicacin de una estructura de datos
dinmicamente asignada. El proceso de calcular un atributo y asociar su valor
calculado con la construccin del lenguaje en cuestin se define como fijacin
del atributo. El tiempo que toma el proceso de compilacin/ejecucin cuando se
presenta la fijacin de un atributo se de nomina tiempo de fijacin. Los tiempos
de fijacin de atributos diferentes varan, e incluso el mismo atributo puede
tener tiempos de fijacin bastante diferentes de un lenguaje a otro. Los
atributos que pueden fijarse antes de la ejecucin se denominan estticos,
mientras que los atributos que slo se pueden fijar durante la ejecucin son
dinmicos. Naturalmente, un escritor de compiladores est interesado en
aquellos atributos estticos que se fijan durante el tiempo de traduccin.
Considere la lista de muestra de atributos dada con anterioridad. Analizamos el
tiempo de fijacin y la significancia durante la compilacin de cada uno de los
atributos en la lista.
En un lenguaje estticamente tipificado como C o Pascal, el tipo de
datos de una variable o expresin es un importante atributo en tiempo de
compilacin. Un verificador de tipo es un analizador semntico que
calcula el atributo de tipo de datos de todas las entidades del lenguaje
para las cuales estn definidos los tipos de datos y verifica que estos
tipos cumplan con las reglas de tipo del lenguaje. En un lenguaje como
C o Pascal, un verificador de tipo es una parte importante del anlisis
semntico. Sin embargo, en un lenguaje como LISP, los tipos de datos
son dinmicos, y un compilador LISP debe generar cdigo para calcular
tipos y realizar la verificacin de tipos durante la ejecucin del programa.
Los valores de las expresiones por lo regular son dinmicos, y un
compilador generar cdigo para calcular sus valores durante la
ejecucin. Sin embargo, algunas expresiones pueden, de hecho, ser
constantes (por ejemplo 3 + 4 * 5), y un analizador semntico puede

elegir evaluarlas durante la compilacin (este proceso se conoce como


incorporacin de constantes).
La asignacin de una variable puede ser esttica o dinmica,
dependiendo del lenguaje y las propiedades de la variable misma. Por
ejemplo. en FORTRAN77 todas las variables se asignan de manera
esttica, mientras que en LISP todas las variables se asignan
dinmicamente. C y Pascal tienen una mezcla de asignacin de
variables est tica y dinmica. Un compilador por lo regular pospondr
los clculos asociados con la asignacin de variables hasta la
generacin de cdigo, porque tales clculos dependen del ambiente de
ejecucin y, ocasionalmente, de los detalles de la mquina objetivo.
El cdigo objeto de un procedimiento es evidentemente un atributo
esttico. El generador de cdigo de un compilador est comprometido
por completo con el clculo de este atributo.
El nmero de dgitos significativos en un nmero es un atributo que con
frecuencia no se trata explcitamente durante la compilacin. Est
implcito en el sentido de que el escritor de compiladores implementa las
representaciones para los valores. Sin embargo, incluso el analizador
lxico puede necesitar conocer el nmero de dgitos significativos
permitidos si va a producir constantes de manera correcta.
Como vimos a partir de estos ejemplos, los clculos de atributos son muy
variados. Cuando aparecen de manera explcita en un compilador pueden
presentarse en cualquier momento durante la compilacin: aun cuando
asociamos el clculo de atributos ms estrechamente con la fase de anlisis
semntico, tanto el analizador lxico como el analizador sintctico pueden
necesitar disponer de informacin de atributo, y puede ser necesario realizar
algn anlisis semntico al mismo tiempo que el anlisis sintctico.

Gramticas con atributos

En la semntica dirigida por sintaxis los atributos estn directamente asociados


con los smbolos gramaticales del lenguaje (los terminales y no terminales). Si
X es un smbolo gramatical, y a es un atributo asociado con X, entonces
escribimos X.a para el valor de a asociado con X. Esta anotacin nos recuerda
el indicador de campo de registro de Pascal o (de manera equivalente) una
operacin de miembro de estructura en C. En realidad, una manera tpica de
implementar clculos de atributo es colocar valores de atributo en los nodos de
un rbol sintctico utilizando campos de registro (o miembros de estructura).
Dada una coleccin de atributos a1 ak, el principio de la semntica
dirigida por sintaxis implica que para cada regla gramatical Xo

X1 X2 . . Xn

(donde Xo es un no terminal, mientras que las otras X son smbolos arbitrarios),


los valores de los atributos X de cada smbolo gramatical Xi aj estn
relacionados con los valores de los atributos de los otros smbolos en la regla.
Si el mismo smbolo Xi apareciera ms de una vez en la regla gramatical,
entonces cada ocurrencia tendra que distinguirse de las otras mediante una
subindizacin adecuada, de manera que se puedan diferenciar los valores de
atributo de diferentes ocurrencias. Cada relacin est especificada por una
ecuacin de atributo o regla semntica de la forma:
Xi.aj=Fij(XO.AJ,.,Xo.ak,x1.a1,.,x1.ak,.,Xn.a1,.,Xn.ak)
Donde Fij, es una funcin matemtica de sus argumentos. Una gramtica con
atributos para los atributos a1,., ak es la coleccin de todas esas ecuaciones
para todas las reglas gramaticales del lenguaje.
En esta generalidad las gramticas con atributos pueden parecer muy
complejas. En la prctica las funciones por lo regular son bastante simples. Por
otro lado, es raro que los atributos dependan de un gran nmero de otros
atributos, as que los atributos pueden separarse en pequeos conjuntos
independientes de atributos interdependientes, y las gramticas con atributos
pueden escribirse de manera separada para cada conjunto.

Por lo general, las gramticas con atributos se escriben en forma tabular, con
cada regla gramatical enumerada con el conjunto de ecuaciones de atributo, o
reglas semnticas asociadas con esa regla de la manera siguiente:

Regla gramatical

Reglas semnticas

Regla 1

Ecuaciones de atributo asociadas

Regla 2

Ecuaciones de atributo asociadas.

Regla 3

Ecuaciones de atributo asociadas

Regla 4

Ecuaciones de atributo asociadas

Regla n

Ecuaciones de atributo asociadas

Ejemplos
.
Consideremos la siguiente gramtica simple para nmeros sin signo:
nmero

nmero dgito | dgito

dgito

0 |1|2|3|4|5|6|7|8|9

El atributo ms importante de un nmero es su valor, al cual le asignamos el


nombre val, Cada dgito tiene un valor que es directamente calculable del
dgito real que representa. A por ejemplo, la regla gramatical dgito

implica

que dgito tiene valor O en este caso. Esto se puede expresar mediante la
ecuacin de atributo dgito.val = O, y asociamos e ecuacin con la regla dgito
O. Adems, cada nmero tiene un valor basado en el dg que contiene.
Si un nmero se deriva utilizando la regla.
Nmero

dgito

entonces el nmero contiene precisamente un dgito. y su valor es el valor de


este dgito. La ecuacin de atributo que expresa este hecho es
nmero. val = dgito. val

Si un nmero contiene ms de un dgito, entonces se deriva utilizando la regla


gramatical
nmero

nmero dgito

y debemos expresar la relacin entre el valor del smbolo en el lado izquierdo


de la gramatical y los valores de los smbolos en el lado derecho. Advierta que
las dos ocurrencias de nmero en la regla gramatical deben distinguirse,
puesto que el nmero a la

derecha tendr un valor diferente del

correspondiente al nmero en la izquierda. Los distinguiremos utilizando


subndices, y la regla gramatical la escribiremos como se muestra a
continuacin:
nmero1

nmero2 dgito

Ahora considere un nmero como 34. Una derivacin (por la izquierda) de este
nmero es de la manera siguiente: nmero
dgito
nmero1

nmero dgito

dgito

3 dgito 34. Considere el uso de la regla gramatical


nmero2 dgito en el primer paso de esa derivacin. El no

terminal nmero2 corresponde al dgito 3, mientras que dgito corresponde al


dgito 4. Los valores de cada uno son 3 y 4, respectivamente. Para obtener el
valor de nmero (es decir, 34). debemos multiplicar el valor de nmero por 10 y
agregar el valor de dgito:
34 = 3 * 10 + 4

En otras palabras, desplazamos el 3 un lugar decimal hacia la izquierda y


sumamos 4. Esto corresponde a la ecuacin de atributos

Nmero1.val = nmero2.val * 10 + dgito.val

Una gramtica con atributos completa para el atributo val se da en la tabla


El significado de las ecuaciones de atributo para una cadena particular pueden
visualizarse utilizando el rbol de anlisis gramatical para la cadena. Por
ejemplo, el rbol de anlisis gramatical para el nmero 345 se da en la figura.
En esta figura el clculo correspondiente a la ecuacin de atributo apropiada se
muestra debajo de cada nodo interior. Visualizar las ecuaciones de atributo
como clculos en el rbol de anlisis gramatical es importante para los
algoritmos que calculan valores de atributo, como veremos en la seccin
siguiente.
Tanto en la tabla como en la figura del ejemplo pusimos nfasis en la diferencia
entre la representacin sintctica de un dgito y el valor, o contenido semntico,
del dgito utilizando diferentes fuentes tipogrficas. Por ejemplo, en la regla
gramatical dgito

O, el dgito O es un token o carcter, mientras que

dgito.val = 0 significa que el dgito tiene el valor numrico ().

Regla gramatical

Reglas semnticas

numero1

numero2digito

numero1.val=numero2.val*10+digito.val

numero

digito

digito

digito.val = 0

digito

digito.val = 1

digito

digito.val = 2

digito

digito.val = 3

digito

digito.val = 4

digito

digito.val = 5

digito

digito.val = 6

digito

digito.val = 7

digito

digito.val = 8

digito

digito.val = 9

numero.val=digito.val

ACTIVIDADES
1. Realice un anlisis profundo de los anlisis semnticos, mirando sus
caractersticas ms importantes y discuta las conclusiones con su tutor.
2. Realice un programa en C++, donde se lean la fecha de un da entre el
ao 0 y el ao n positivo, y como resultado de la fecha del da siguiente
con el respectivo da de la semana.
Ejemplo:
Entrada:

19/07/2007

Salida:

Viernes 20/07/2007

Mire como trabaja el compilador los anlisis sintctico y lxico, sus


mensajes, errores entre otros.
Realice un listado de estos mensajes y las ayudas que le da al programador
el compilador.

Vous aimerez peut-être aussi