TEMA 6

´ ´ ANALISIS SEMANTICO

Bibliograf´a: ı

¯ Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, t´ cnicas y herramientas, Tema 5, 6 (pag. 287-400), Tema 7 (pag. e 443-454). ¯ Louden, K.C. (1997), Compiler Construction: Principles and Practice, Tema 6, p´ ginas: 257-344. a
Contenido: Duraci´ n: 10 horas o 1 La fase de an´ lisis sem´ ntico. a a 2 Especificaci´ n sem´ ntica de un lenguaje: o a 2.1 Concepto de atributo, tipos de atributos y tipos de enlace. 2.2 Gram´ ticas de atributos. a 2.3 Ecuaciones de atributos. ´ 2.4 Arbol de an´ lisis sint´ ctico anotado. a a 3 M´ todos para la evaluaci´ n de atributos: e o 3.1 Basados en grafos de dependencias. 3.2 Basados en reglas. 4 C´ lculo de atributos durante el proceso de an´ lisis sint´ ctico. a a a

138

´ ´ 6.1. LA FASE DE ANALISIS SEMANTICO

5 Teorema de Knuth. 6 La Tabla de S´mbolos: ı 6.1 Organizaci´ n y mantenimiento de la Tabla de S´mbolos. o ı ´ 6.2 Reglas de ambito de referencia. 7 Comprobaci´ n de tipos: o ´ 7.1 Representaci´ n de expresiones de tipos mediante arboles. o 7.2 Equivalencia estructural y por nombre. 8 Inferencia de tipos. 9 Errores sem´ nticos. a 10 Esquemas de traducci´ n dirigidos por la sintaxis. o

´ ´ 6.1 LA FASE DE ANALISIS SEMANTICO En este tema se aborda el problema del c´ lculo de informaci´ n que no a o puede ser descrita por las gram´ ticas independientes del contexto (GIC), a y que por tanto, no se considera como parte del an´ lisis sint´ ctico. La a a informaci´ n que se calcula en esta fase est´ relacionada con el significado o a (la sem´ ntica) del programa y no con su estructura (la sint´ xis). a a ´ Se asocia informaci´ n a las construcciones del lenguaje de programacion o proporcionando atributos a los s´mbolos de la gram´ tica (por ejemplo: el ı a ´ valor de una expresi´ n, el tipo de una variable, su ambito, un trozo de o ´ c´ digo, el n´ mero de argumentos de una funcion, etc). Los valores de los o u atributos se calculan mediante reglas sem´ nticas asociadas a las produca ciones gramaticales. El an´ lisis sem´ ntico incluye: a a

¯ La construcci´ n de la Tabla de S´mbolos para llevar un seguimieno ı to del significado de los identificadores en el programa (variables,

´ ´ TEMA 6. ANALISIS SEMANTICO

139

funciones, tipos, par´ metros y m´ todo de paso de par´ metros en funa e a ciones, etc)

¯ Realizar la comprobaci´ n e inferencia de tipos en expresiones y seno ´ tencias (por ejemplo, que ambos lados de una asignacion tengan tipos adecuados, que no se declaren variables con el mismo nombre, que los ´ par´ metros de llamada a una funci´ n tengan tipos adecuados, numero a o de par´ metros correcto, ) a
Nos centraremos en el an´ lisis sem´ ntico est´ tico: se realiza en tiempo de a a a compilaci´ n, no de ejecuci´ n. o o ¿ C´ mo vamos a especificar (describir) la estructura sem´ ntica de un o a lenguaje? Mediante gram´ ticas de atributos. a ´ ¿ C´ mo vamos a implementar la estructura semantica de un lenguaje? o ´ A partir de la construcci´ n del arbol de an´ lisis sint´ ctico, lo recorrereo a a ´ mos en un determinado orden y calcularemos en cada nodo la informaci on sem´ ntica necesaria (el valor de una expresi´ n, el tipo de una variable, su a o ´ ´ ambito de declaraci´ n, el n´ mero de argumentos de una funcion, etc). o u Conceptualmente, se analiza sint´ cticamente la cadena de componentes a ´ l´ xicos de entrada, se construye el arbol de an´ lisis sint´ ctico y despu´ s se e a a e ´ recorre el arbol, en un determinado orden para tener en cuenta las dependencias, para evaluar las reglas sem´ nticas en sus nodos. a
cadena de entrada árbol análisis sintáctico grafo de dependencias orden de evaluación de reglas semánticas

Hay casos especiales que se pueden implantar de una sola pasada evaluando las reglas sem´ nticas durante el proceso de an´ lisis sint´ ctico, sin a a a ´ construir expl´citamente un arbol de an´ lisis sint´ ctico. Mayor eficiencia ı a a en cu´ nto al tiempo de compilaci´ n. a o

140

´ 6.2. ATRIBUTOS Y GRAMATICAS DE ATRIBUTOS

´ 6.2 ATRIBUTOS Y GRAMATICAS DE ATRIBUTOS ´ Un atributo es cualquier propiedad de una construccion de un lenguaje de programaci´ n. Var´an en funci´ n del tipo de informaci´ n que contienen, su o ı o o complejidad de c´ lculo y el momento en el que son calculados (en tiempo a de compilaci´ n (atributos est´ ticos) o de ejecuci´ n (din´ micos)). o a o a Ejemplos t´picos son: ı

¯ el nombre de una variable ¯ el tipo de una variable
´ ¯ el ambito de una variable

¯ el valor de una expresi´ n o
´ ¯ el n´ mero de argumentos de una funcion u

¯ la posici´ n en memoria de una variable o ¯ un fragmento de c´ digo o
Ejemplos de atributos que se calculan en tiempo de compilaci´ n: el tipo o de dato, el nombre de una variable, el c´ digo de un procedimiento. o Ejemplos de atributos que se calculan en tiempo de ejecuci´ n: la posici´ n o o de una variable, el valor de una expresi´ n. Aunque algunas expresiones son o constante y se pueden calcular en tiempo de compilaci´ n (c´ lculo previo o a de constantes), por ejemplo print(‘‘%d’’, 3+4*2);. Nos centraremos en el an´ lisis sem´ ntico est´ tico (construcci´ n de la Tabla a a a o de S´mbolos y comprobaciones e inferencia de tipos), ya que el din´ mico ı a depende de la arquitectura de la m´ quina, del sistema operativo (control de a ejecuci´ n, gesti´ n de la memoria, llamadas a funciones, etc) o o

´ ´ TEMA 6. ANALISIS SEMANTICO

141

Se llama enlace (binding) al proceso de calcular el valor del atributo y ´ asociarlo a su correspondiente construccion ling¨ ´stica. Puede ser enlace uı din´ mico o est´ tico seg´ n el momento en que se calcule. a a u Una gram´ tica de atributos es una generalizaci´ n de una gram´ tica ina o a dependiente del contexto en la que cada s´mbolo gramatical (terminal o ı no-terminal) tiene asociado un conjunto de atributos. es un s´mbolo de la gram´ tica, y es un atributo asociado a ı a Si para denotar el atributo asociado a . entonces escribiremos
¼ ½ ¾

,

Dada una producci´ n de la forma o Ò , el valor de los atributos para cada s´mbolo de la gram´ tica se relacionan entre s´ ı a ı mediante lo que llamaremos ecuaciones de atributos. Estas ecuaciones tienen la forma:

´

¼

½

¼

½

½

½

Ò

½

Ò

µ

En la pr´ ctica estas funciones matem´ ticas a a suelen ser bastante sencillas y los atributos suelen ser independientes unos de otros ( o como mucho dependientes entre varios). Las gram´ ticas de atributos se suelen escribir en forma tabular, con una a parte donde aparecen las producciones y otra donde aparecen las reglas sem´ nticas (o ecuaciones de atributos) que permiten calcular los atributos. a
Producci´ n o Producci´ n 1 o . . . Producci´ n n o Reglas Sem´ nticas a Ecuaciones de atributos para producci´ n 1 o . . . Ecuaciones de atributos para producci´ n n o

Lo denotaremos por Ú Ð. e o Las reglas sem´ nticas para el c´ lculo de este atributo ser´an: a a ı Producci´ n o ½ ½ ¾ ¾ Reglas sem´ nticas a ̽ Ì Ì Ì¾ ´   £ µ · Ì Ì ÒÙÑ Ú Ð ¾Ú Ð ÌÚ Ð ½ Ú Ð ¾ Ú Ð Ì Ú Ð Ú Ð ÌÚ Ð Ì½ Ú Ð Ì¾ Ú Ð £ Ú Ð ÌÚ Ð ÚÐ ÚÐ ÚÐ Ú Ð Ð Ü Ñ ÒÙÑ ½ · ´ µ ´ Nota: Si un s´mbolo aparece m´ s de una vez en una produccion. para la entrada (4-3)*2. Consideremos la gram´ tica para la generaci´ n de expresiones a o aritm´ ticas simples: ¿ Qu´ atributos nos interesan en esta gram´ tica? e e a Ì Ì ´ £ · Ì ÒÙÑ  Ì Ì µ El valor num´ rico de la expresi´ n.2. Por ejemplo. Una flecha que va desde los atributos que aparecen en la parte derecha de la ecuaci´ n hacia el del lado o ´ izquierdo.142 ´ 6. ´ Los atributos se colocan al lado de los nodos del arbol de an´ lisis sint´ ctico a a y se dibujan las dependencias entre ellos. enı a tonces cada aparici´ n debe ser distinguida de las otras apariciones. ATRIBUTOS Y GRAMATICAS DE ATRIBUTOS Ejemplo 1. el arbol ser´a: ı . para o que los diferentes valores de las ocurrencias sean distinguidos.

y. ANALISIS SEMANTICO 143 E val=1 T * val=1 ) val=2 val=2 F val=2 T val=1 F ( val=4 val=4 val=4 E T F E - num val=2 T val=3 F val=3 num val=3 val=4 num Ejemplo 2.´ ´ TEMA 6. Las reglas sem´ nticas para el c´ lculo de este atributo ser´an: Para la a a ı Producci´ n o Reglas sem´ nticas a Ð ÌÝÔ Î Ö Ä ×Ø Î Ö Ä ×Ø ØÝÔ ÌÝÔ ØÝÔ ÌÝÔ ÒØ ÌÝÔ ØÝÔ ÒØ ÖÓ ÌÝÔ Ö Ð ÌÝÔ ØÝÔ Ö Ð Î Ö Ä ×ؽ Î Ö Ä ×ؾ ØÝÔ Î Ö Ä ×ؽ ØÝÔ Î Ö Ä ×ؾ ØÝÔ Î Ö Ð ×ؽ ØÝÔ Î Ö Ä ×Ø ØÝÔ Î Ö Ä ×Ø ØÝÔ ´ entrada float x. La gram´ tica para la declaraci´ n de variables en C. Lo denotaremos por ØÝÔ . ¿ Qu´ a o e Ð ÌÝÔ Î Ö Ä ×Ø ÌÝÔ ÒØ ­Ó Ø Î Ö Ä ×Ø Î Ö Ä ×Ø atributos nos interesan en esta gram´ tica? a El tipo de la variable. el arbol de an´ lisis sint´ ctico con los atributos es: a a .

ATRIBUTOS Y GRAMATICAS DE ATRIBUTOS Decl type=real Type type=real type=real id x Var_List . ½ ¾ . ı ´ ¯ La funci´ n Þ Ó ´ÒÙÑ Ú Ðµ crea un nodo para un numero con o etiqueta num y un campo que contiene el valor del n´ mero. ¯ La funci´ n Þ Ó ´ o ÒØÖ µ crea un nodo para un identificador con etiqueta id y un campo que contiene un puntero a la entrada de la Tabla de S´mbolos para ese identificador. veamos una gram´ tica de a ´ atributos para la construcci´ n de un arbol sint´ ctico para una gram´ tica de o a a expresiones aritm´ ticas con operadores binarios: e Producci´ n o ½ ½ ´ Reglas Sem´ nticas a ¾ ¾   ½µ · ÒÙÑ ÔØÖ ÔØÖ ÔØÖ ÔØÖ ÔØÖ ÞÒÓ Ó ½ ÔØÖ ÞÒÓ Ó   ½ ÔØÖ ½ ÔØÖ Þ Ó ÐÜÑ Þ Ó ÒÙÑ Ð Ü Ñ ´ · ´ ¼ ¼ ¼ ¼ ¾ ÔØÖ ¾ ÔØÖ µ µ µ ´ ´ ÔØÖ ÒÙÑ Ú Ð µ ¯ La funci´ n ÞÒÓ Ó´ÓÔ Þ o Öµ crea un nodo para un operador con etiqueta ÓÔ y dos campos que contienen los punteros al hijo izquierdo y derecho. Los atributos Ô Ô a o Ô son punteros a los nodos y entradaa y entradac son punteros a las entradas de las ı variables y en la Tabla de S´mbolos.2. por ejemplo un puntero a un nodo de arbol. u ´ La siguiente secuencia de llamadas a funciones crea el arbol de an´ lisis a sint´ ctico para la expresi´ n a-4+c.144 ´ 6. type=real Var_List float type=real id y Otro ejemplo: Como ejemplo de que un atributo puede ser cualquier ´ cosa.

ANALISIS SEMANTICO 145 Ô Ô Ô Ô Ô ½ ¾ ¿ = = = = = hazhoja(id. 4) haznodo(’-’.Ô . entradac) haznodo(’+’.´ ´ TEMA 6.Ô .Ô ) ½ ¾ ¿ ´ Son atributos sintetizados por tanto tenemos que construir el arbol de abajo hacia arriba (ascendente).Ô ) hazhoja(id. E + E E id a entradaa id - + E num 4 E id c id - n entradac . entradaa) hazhoja(num.

A partir de este se obtiene un orden de evaluaci´ n de las reglas sem´ nticas. a a ı ´ Un atributo es sintetizado si. dada una produccion ´ la unica ecuaci´ n de atributos que tenemos es de la forma: o ½ ¾ Ò. ´ ½ ½ ½ Ò ½ Ò µ Por ejemplo: el valor de una expresi´ n en la gram´ tica del ejemplo o a anterior era un atributo sintetizado. a Atributos heredados: Un atributo es heredado si su valor depende de los valores de los atributos de su padre y/o de sus hermanos.2. Se podr´ n calcular a la vez que a se realiza el an´ lisis sint´ ctico ascendente LR. Las dependencias entre los atributos se representan en un grafo. a a n . Atributos sintetizados: Un atributo es sintetizado si su valor depende de los valores de los atributos de sus hijos. ATRIBUTOS Y GRAMATICAS DE ATRIBUTOS 6. o a ´ Arbol anotado o decorado: ´ Es el arbol de an´ lisis sint´ ctico al que se le han a˜ adido los atributos. Por ejemplo: el tipo de una variable en la gram´ tica anterior era un a atributo heredado. Una gram´ tica en la que todos los atributos son sintetizados se le llama a gram´ tica de atributos-S.146 ´ 6.1 Tipos de atributos Los atributos se clasifican en funci´ n de c´ mo se calculen en: atributos o o sintetizados y atributos heredados. desde las hojas a la ra´z.2.

postfija).1 Grafo de dependencias ´ a a Si un atributo en un nodo de un arbol de an´ lisis sint´ ctico depende de un a atributo . entonces se debe evaluar la regla sem´ ntica para en ese nodo despu´ s de la regla sem´ ntica que define a .3. para cada producci´ n queda predeterminado por el disenador o del compilador el orden de evaluaci´ n de los atributos de esa cono ´ strucci´ n ling¨ ´stica.´ ´ TEMA 6. No siempre ser´ necesario cona ´ struir el arbol de an´ lisis sint´ ctico para despu´ s recorrerlo. Poco eficientes (en espacio y ´ tiempo) porque necesitan construir todo el arbol de an´ lisis sint´ ctico a a ´ y sobre el. Posibilidad de ciclos.3 METODOS PARA LA EVALUACION DE LOS ATRIBUTOS Se han propuesto varios m´ todos para la evaluaci´ n de las reglas sem´ nticas: e o a ¯ M´ todos basados en grafos de dependencias: en el momento de la e ´ compilaci´ n estos m´ todos obtienen un orden de evaluacion a partir o e ´ del grafo de dependencias sobre el arbol de an´ lisis sint´ ctico para a a la entrada dada (el programa fuente). a . ´ ¯ M´ todos basados en reglas: en el momento de la construcci on del e ˜ compilador. ANALISIS SEMANTICO 147 ´ ´ 6. y as´ la forma de recorrer el arbol para calcular o uı ı ese atributo (prefija. Las interdependencias entre e a ´ los atributos heredados y sintetizados en los nodos de un arbol de an´ lisis a sint´ ctico se pueden representar mediante un grafo de dependencias. a 6. los atriba a e utos sintetizados se pueden calcular a la vez que se realiza el an´ lisis a sint´ ctico. el grafo de dependencias para cada entrada. infija.

Existe un subgrafo de la forma: producci´ n o A a X x Y y Los nodos del grafo se marcan con un c´rculo ¯ y corresponden con ı ´ los atributos. Por ejemplo para la entrada:3+2. Si la producci´ n o y tambi´ n una arista hacia e entonces habr´ una arista hacia Ü desde a Ü desde Ý. puesto que Ü depende tanto de como de Ý . si el atributo depende del atributo .3. c b b=f(c) Por ejemplo. a tiene asociada la regla sem´ ntica Ü a ´ ݵ. siempre que se a e use la primera producci´ n tendremos que a˜ adir al grafo de dependencias o n las aristas siguientes. si la regla ´ Ü Ýµ es una regla sem´ ntica para la a . Nota: en los grafos de dependencias se suelen ignorar los sub´ndices ı correspondientes a repeticiones de los s´mbolos de la gram´ tica. METODOS PARA LA EVALUACION DE LOS ATRIBUTOS ¿ C´ mo se construye el grafo de dependencias? o El grafo tiene un nodo por cada atributo y una arista que va desde el nodo de hacia el nodo . porque ı a . Los atributos se representan junto a los nodos del arbol sint´ ctico.148 ´ ´ 6. A a X x Y y Ejemplo Para la gram´ tica que genera expresiones aritm´ ticas.

½ ¾ Un ordenamiento topol´ gico da un orden v´ lido para evaluar los atribuo a tos. es decir.´ ´ TEMA 6. recorriendo el grafo en ese orden se nos garantiza que tenemos los valores de los atributos ya calculados necesarios para evaluar las reglas en sem´ nticas en cada nodo que visitemos. si Ñ a Ñ es una arista desde Ñ a Ñ . Es decir. a ı Orden de evaluaci´ n de un grafo de dependencias o Un ordenamiento topol´ gico de un grafo dirigido ac´clico es todo oro ı Ñ de los nodos del grafo. ½ ½ . ANALISIS SEMANTICO 149 Producci´ n o Reglas Sem´ nticas a ¾ ÒÙÑ ½ · Ú Ð ½Ú Ð ¾Ú Ð Ú Ð Ð Ü Ñ ÒÙÑ · ´ µ E val E1 val + E 2 val num val num val ´ queda suficientemente claro con su colocaci´ n en el arbol de an´ lisis sint´ ctico o a a a cu´ l s´mbolo nos estamos refiriendo. Es decir. los atributos a ´ µ est´ n disponibles para poder evaluar a una regla sem´ ntica a . entonces Ñ aparece antes que Ñ en el ordenamiento. tal que garanticemos denamiento Ñ Ñ que las aristas van desde los nodos que aparecen primero en el ordenamiento a los que aparecen m´ s tarde.

a a D tipo=real 4 T 7 tipo=real 5 tipo=real L . ) ¾ ½ . L.150 ´ ´ 6. ) ). Producci´ n o D T T L L T L int float Ľ .tipo = real Ľ . tipo=real 8 float 9 tipo=real L id lexema 2 tipo=real 10 id lexema 1 El ordenamiento 1 2 3 4 5 6 7 8 9 10.tipo) n a˜ adetipo(id.3. Para la gram´ tica que genera declaraciones de variables. id id Reglas Sem´ nticas a L.tipo a˜ adetipo(id. ser´a uno de los posibles.tipo = integer T.tipo = L.lexema. L. id.tipo) n ´ El arbol de an´ lisis sint´ ctico para la entrada float id. nos a interesa un atributo que indica el tipo de los identificadores.lexema.tipo T. ) ). id.tipo = T. da lugar ı a la ejecuci´ n de las instrucciones que almacenan el tipo real en la entrada o de la Tabla de S´mbolos para cada identificador: ı = real a˜adetipo(lexema( n a˜adetipo(lexema( n a˜adetipo(lexema( n ¿ ). METODOS PARA LA EVALUACION DE LOS ATRIBUTOS Ejemplo. tipo=real id 6 lexema 3 L .

3.´ ´ TEMA 6. Otra alternativa o a este m´ todo: la evaluaci´ n de los atributos basada en reglas. Desventajas: para cada entrada (cada programa fuente) tenemos que ´ construir el grafo dirigido y encontrar en tiempo de compilacion el ordenamiento topol´ gico. Estos nodos suelen a e a a (deben) aparecer en las primeras posiciones del ordenamiento. a a ´ Recorrido del arbol con atributos sintetizados El valor de los atributos en una gram´ tica de atributos sintetizados puede a ´ ser calculado mediante un recorrido ascendente del arbol (bottom-up) o en modo postorder (el padre el ultimo). El implementador del compie a lador analiza la gram´ tica y establece un orden de evaluaci´ n de los atribua o tos en el momento de la construcci´ n del compilador. e o 6. El valor ı ı ´ de los atributos en estos nodos no dependen de ning un otro atributo. y se pueden calcular usando la informaci´ n disponible en ese momento (la o proporciona el an´ lisis l´ xico o el an´ lisis sint´ ctico). En pseudoc´ digo: o ´ procedimiento EvaluaPostOrder(T:nodo) inicio de Ì hacer para cada hijo EvaluaPostOrder( ) // visitamos los hijos fin para // procesamos el nod padre Calcular los atributos sintetizados para Ì fin . ANALISIS SEMANTICO 151 ´ Una pregunta que surge es como evaluar los atributos que se encuentran en las ra´ces del grafo (ra´z: un nodo que no tiene predecesor). Implica un recorrido o ´ prefijado del arbol de an´ lisis sint´ ctico. Poco eficiente en espacio y tiempo.2 M´ todos basados en reglas e Es el m´ todo que se utiliza en la pr´ ctica.

METODOS PARA LA EVALUACION DE LOS ATRIBUTOS Para lanzarlo EvalPostOrder(raiz). case Minus: t->val= t->lchild->val-t->rchild->val.152 ´ ´ 6. switch(t->kind) case Plus: t->val= t->lchild->val+t->rchild->val. Para la gram´ tica que genera expresiones aritm´ ticas: a e Producci´ n o ½ ½ ½ ½ ´ Reglas sem´ nticas a ¿ ¿ ¿ ¾ ¾ ¾ ·   £ ¾ µ ÒÙÑ ÚÐ ½ Ú Ð ½ Ú Ð ½ Ú Ð ÚÐ Ð ½ Ú Ð ¿Ú Ð ¾ Ú Ð  ¿ Ú Ð ¾ Ú Ð£ ¿ Ú Ð ¾ Ú Ð Ü Ñ ÒÙÑ ¾ · ´ µ El c´ digo correspondiente en . typedef struct streenode NodeKind kind. void postEval(SyntaxTree t) if (t->lchild!=NULL) postEval(t->lchild). Num NodeKind. ser´a ı typedef enum Plus. break. . break. break. struct streenode *lchild. STreeNode. case Mult: t->val= t->lchild->val*t->rchild->val. Ejemplo. int val. Mult.3. *rchild. typedef STreeNode * SyntaxTree. case Num: t->val= lexema(num). Minus. con la siguiente estructura para la o ´ definici´ n de arbol de an´ lisis sint´ ctico(para esta gram´ tica tenemos un o a a a ´ arbol binario). break. if (t->rchild!=NULL) postEval(t->rchild).

ANALISIS SEMANTICO 153 .´ ´ TEMA 6.

METODOS PARA LA EVALUACION DE LOS ATRIBUTOS ´ Recorrido del arbol con atributos heredados ´ Cuando los atributos son heredados la informaci on pasa del padre a los hijos y/o de hermanos a hermanos. El valor de los atributos puede ser cal´ culado mediante un recorrido del arbol en modo preorder (procesamos el padre el primero).154 ´ ´ 6. En pseudoc´ digo: o procedimiento EvaluaPreOrder(T:nodo) inicio de Ì (en orden adecuado) hacer para cada hijo Evaluar los atributos heredados para EvaluaPreOrder( ) //visitamos los hijos fin para fin Importante: Aqu´ es importante el orden en que se eval´ an los hijos. A veces es necesario combinar recorrido prefijo/infijo.3. Ejemplo: La gram´ tica para la declaraci´ n de variables en C. type=real Var_List float type=real Ð ÌÝÔ Î Ö Ä ×Ø ÌÝÔ ÒØ ­Ó Ø Î Ö Ä ×Ø Î Ö Ä ×Ø id y . ya ı u que pueden existir dependencias entre hermanos. a o Decl type=real Type type=real type=real id x Var_List .

Var List: Asignar T.type=integer. . sino T. ¯ P. ej: el nodo de tipo Var List asigna el tipo a sus hijos antes de hacer ninguna llamada recursiva (proceso preorder). ANALISIS SEMANTICO 155 ¿ Cual es el tipo de recorrido? Procedure EvalType(T:nodo) inicio ´ segun tiponodo de T Decl: EvalType(Type). Asignar tipo del hijo Type al hijo Var List. ej: el nodo de tipo Decl requiere que se calcule el tipo del primer hijo. se asigne al segundo hijo y despu´ s se evalue el segundo hijo e (se realizan operaciones despu´ s de procesar el primer hijo y antes e de llamar recursivamente para procesar el segundo hijo: proceso inorder).type=real. ´ fin segun fin Not´ se como se combinan operaciones de tipo preorder e inorder dee pendiendo del tipo de nodo de que se trate: ¯ P. EvalType(Var List).type al tercer hijo EvalType( tercer hijo Var List). Type: si (hijo de T == int) entonces T.´ ´ TEMA 6.type al primer hijo de T. si (tercer hijo!=NULL) entonces Asignar T.

case id: if (t->sibling!=NULL) t->sibling->type= t->type. . *sibling. struct streenode *child. Typekind type. Type. // solo para id * SyntaxTree. id integer. typedef struct streenode NodeKind kind.156 ´ ´ 6. EvalType(t->sibling). char *name. EvalType(t->child->sibling). else t->type=real. real NodeKind. suponiendo implementado a o ´ la estructura de arbol de an´ lisis sint´ ctico como una lista de punteros a a a primer hijo y hermanos: Decl Type (type=real) id id NULL typedef enum typedef enum Decl. TypeKind. void EvalType(SyntaxTree t) switch(t->kind) case Decl: EvalType(t->child). case Type: if (t->child == int) t->type=integer. break. break. METODOS PARA LA EVALUACION DE LOS ATRIBUTOS De una forma m´ s concreta en c´ digo C. t->child->sibling->type= t->child->type.3. break.

´ ´ TEMA 6. En pseudoc´ digo: o procedimiento EvaluaCombinada(T:nodo) inicio de Ì hacer para cada hijo Evaluar los atributos heredados para EvaluaCombinada( ) fin para Calcular los atributos sintetizados para Ì fin ´ La principal consideraci´ n a tener en cuenta durante el recorrido del arbol o es que los atributos heredados en un nodo se calculen antes de que el nodo sea visitado por primera vez y que los atributos sintetizados se calculen antes de abandonar el nodo. en el caa so de que los atributos heredados no dependan de atributos sintetizados ´ es posible calcularlos en un solo recorrido combinando PostEval y PreEval. . ANALISIS SEMANTICO 157 ´ Recorrido del arbol con atributos heredados y sintetizados En gram´ ticas que combinan atributos sintetizados y heredados.

base=8 Basechar.base==8) error else 9 Num Basechar Basechar o Basechar d Num½ Num¾ Digit Num Digit . Digit.base Digit.3. .base Basechar.val==error) error else Num¾ .val Num.base=Num½ . .base=Num½ .val= if (Digit.base Num.val Num¾ . a u o Producci´ n o Based num Reglas sem´ nticas a Based num.base+Digit.val==error or Num¾ .val=Digit.val*Num½. METODOS PARA LA EVALUACION DE LOS ATRIBUTOS Ejemplo.val=0 . Digit Digit Digit 0 8 9 Necesitamos dos atributos: Ú Ð (sintetizado) para almacenar el valor del n´ mero y × (heredado) para almacenar el tipo de base en que se expresa u ´ y no depende del anterior.base Digit. el arbol anotado es: val=3*8+4=28 Based_num base=8 val=3*8+4=28 Num base=8 val=4 Basechar o val=3 Num base=8 Digit base=8 4 val=3 Digit base=8 3 .val= if (Digit.val= if (Digit.base=Basechar. Gram´ tica que genera n´ meros en notaci´ n octal y decimal.base==8) error else 8 Digit.base=Num.val Digit.base=10 Num½ . . .val=Num.158 ´ ´ 6. Para la entrada 34o.

este es el izquierdo. Num: t->lchild->base=t->base. else t->val=t->lchild->val. //evalua hijo drcho t->lchild->base=t->rchild->base.´ ´ TEMA 6. a . EvalBasedNum(t->lchild). // es hered. // es sintet. EvalBasedNum(t->lchild). //evalua hijo izqd if (t->rchild!=NULL) t->rchild->base=t->base. else t->val=t->lchild->val. EvalBasedNum(t->rchild). Digit: if (t->base==8 and t->lchild==8 or 9) t->val=error. ´ ´ Se ha supuesto que cuando solo hay un hijo. Veremos un ejemplo en los ejercicios. else t->base=10.//evalua hijo izqdo t->val=t->lchild->val. else t->val=error. Situaciones en los que los atributos heredados dependen de los sintetizados ´ son m´ s complejas y requieren m´ s de una pasada sobre el arbol de an´ lisis a a a sint´ ctico. if (t->lchild->val!=error and t->rchild->val!=error t->val=t->base*t->lchild->val+t->rchild->val. Basechar: if (t->lchild==o) t->base=8. ANALISIS SEMANTICO 159 El procedimiento a dise˜ ar para la evaluaci´ n ser´a en este caso: n o ı Procedure EvalBasedNum(t:nodo) switch(t->kind) Based num: EvalBasedNum(t->rchild).

3. esto ser´a incorrecto: ı Ë ½ ¾ ÔÖ ÒØ ½ Ö ´ ½ Ö ¾ µ Ö ¾ Resulta que el atributo Ö es heredado y si hacemos un recorrido ´ en modo preorden.her=2 A a print("1") print("2") . La soluci´ n correcta ser´a: o ı Ë ½ Ö ÔÖ ÒØ ½ ´ Ö ½ µ ¾ Ö ¾ ¾ Para la cadena aa S A. METODOS PARA LA EVALUACION DE LOS ATRIBUTOS Aspectos a tener en cuenta en la colocaci´ n de las reglas para la evalo uaci´ n de los atributos o ¯ Un atributo heredado para un s´mbolo en el lado derecho de una ı producci´ n se debe calcular en una acci´ n situada antes que dicho o o s´mbolo. La acci´ n para calcularlo se debe colocar o al final del lado derecho de la producci´ n. o Por ejemplo.her=1 A a A.160 ´ ´ 6. en la segunda producci on no est´ definido cuando se a intenta imprimir su valor. ı ¯ Una acci´ n no debe referirse a un atributo sintetizado de un s´mbolo o ı que est´ a la derecha de la acci´ n. e o ¯ Un atributo sintetizado para el no-terminal de la izquierda s´ lo se o puede calcular despu´ s de que se hayan calculado todos los atributos e a los que se hace referencia.

´ ´ TEMA 6. a a Una gram´ tica con atributos a o atributo heredado y cada producci´ n de atributos asociadas son de la forma: ½ ¼ es de atributos-L si. considerando los atributos heredados como par´ metros a a a de los procedimientos y los atributos sintetizados como valores devueltos. que aparecen a la izquierda de ci´ n. implican que no existan dependencias hacia atr´ s a ´ en el arbol (dependencias que apuntan desde la derecha hacia la izquierda). o ı u Actualmente. . no es importante. ANALISIS SEMANTICO 161 ´ ´ ´ 6. son de atributos-L. para cada Ò . e Los m´ todos ÄÄ y ÄÊ. el valor de en depende s´ lo de los atributos de los (i-´ simos) o e en la producs´mbolos ı   . se pueden calcular durante el proceso de an´ lisis sint´ ctico.4 EVALUACION DE ATRIBUTOS DURANTE EL ANALISIS SINTACTICO ¿ Hasta qu´ punto los atributos se pueden calcular en el propio proceso de e an´ lisis sint´ ctico sin necesidad de hacer recorridos adicionales sobre el a a ´ arbol? La respuesta depende del tipo de an´ lisis que se utilice. al evaluar la cadena de componentes l´ xicos de e izquierda a derecha. De la definici´ n se deduce que una gram´ tica de atributos-Ë es de o o a atributos-Ä. excepto la gram´ tica a a que generaba n´ meros en base octal/decimal. Las gram´ ticas de atributos que satisfacen esta condici´ n se les llama a o gram´ ticas de atributos-L (gram´ tica de atributos por la izquierda). tal que los atributos heredados no a dependen den los sintetizados. las ecuaciones ½ ¾ ´ ¼ ½ ¼  ½ ½  ½ µ Es decir. u Dada una gram´ tica de atributos-Ä. ¼ ½ Ejemplos: todas las gram´ ticas vistas hasta ahora. a Inter´ s: sobre todo en los primeros compiladores con limitados recursos e de computaci´ n se pretend´a realizar el n´ mero menor posible de pasadas.

Digit: if (base==8 and t->lchild->val==8 or 9) return (error) else return (t->lchild->val).temp2. EVALUACION DE ATRIBUTOS DURANTE EL AN ALISIS SINTACTICO ´ De este modo. . int base) int temp. base). esto es lo que permite la herramienta PCCTS). a u El c´ digo visto se puede convertir usando funciones en: o int EvalBasedNum(t:nodo) return (EvalNum(t->lchild. if (t->rchild!=NULL) temp2=EvalNum(t->rchild. else return (10). int EvalBase(t:nodo) if (t->lchild==o) return (8). if (temp!=error and temp2!= error) return (temp*base+temp2).4. return(temp).base). La funcion para un noterminal toma como argumentos un nodo y los valores de los atributos heredados para y devuelve como resultados los valores de los atributos sintetizados para (de hecho.162 ´ ´ ´ 6. int EvalNum(nodo t. switch(t->kind) Num: temp=EvalNum(t->lchild. se evita almacenarlos en cada nodo. else return (error). Ejemplo: La gram´ tica que genera n´ meros en base octal y decimal. EvalBase(t->rchild).

ANALISIS SEMANTICO 163 .´ ´ TEMA 6.

PILA VAL. # #3 #3 #3 #3 4 #12 #12 #12 # 12 5 #17 #17 Ò Ò Ú Ð ÒÚ Ð Ú Ð ÒÚ Ð ½ Ú Ð ¾ Ú Ð£ Ú Ð ÒÚ Ð ½ Ú Ð ¾ Ú Ð £ ¿ ÚÐ Ò · · ¿ ÚÐ En Bison/Yacc. desplazar reducir desplazar desplazar reducir reducir desplazar desplazar reducir reducir aceptar £ Ò ´ ´ ACCION SEMANT. . El analizador sint´ ctico puede mantener en la pila a a de an´ lisis sint´ ctico los valores de los atributos asociados con los s´mbolos a a ı de la gram´ tica. EVALUACION DE ATRIBUTOS DURANTE EL AN ALISIS SINTACTICO Si los atributos son sintetizados se pueden evaluar con un analizador sint´ ctico ascendente. Ejemplo Dispondremos. adem´ s de la pila de an´ lisis sint´ ctico. La pila de valores se manipula a de forma paralela a la de an´ lisis sint´ ctico. a a · PILA # #n #E #E* #E*n #E*E #E #E+ #E+n #E+E #E ENTRADA 3*4+5# *4+5# *4+5# 4+5# +5# +5# +5# 5# # # # ´ ACCION SINT.164 ´ ´ ´ 6. que ya se encuentran en la pila. la regla sem´ ntica se hubiera implementado como: a E : E + E $$=$1+$3.4. de una pila de a a a valores en la que se van almacenando los valores de los atributos sintetizados (como un registro si hay m´ s de uno). Cuando se hace una reducci´ n se calcula el valor de los a o nuevos atributos a partir de los valores de los atributos de los s´mbolos de ı la parte derecha.

ANALISIS SEMANTICO 165 6. Supongamos que existe ya una tabla creada en la que insertamos el nombre del identificador (que se utiliza como clave) y su ´ tipo.´ ´ TEMA 6. Adem´ s. . Producci´ n o Reglas sem´ nticas a Ð ÌÝÔ Î Ö Ä ×Ø ÌÝÔ ÒØ ØÝÔ ÒØ ÖÓ ÌÝÔ ­Ó Ø ØÝÔ Ö Ð Î Ö Ä ×Ø Î Ö Ä ×Ø insert(lexema(id). como cada a ı a declaraci´ n tiene asociada un s´ lo tipo. ..type) Nota: Esto ya no es una gram´ tica de atributos!!! (aunque el resultado a sea el mismo).type) Î Ö Ä ×Ø insert(lexema(name). en la generaci´ n de c´ digo).. Por ejemplo: el tipo de una o variable (en la comprobaci´ n de tipos. podemos usar una variable global. funciones y tipos. o Ejemplo de uso de estas estructuras externas: la gram´ tica de la declaraci´ n a o de variables en C. variables. La Tabla de S´mbolos es el ejemplo m´ s importante de una estructura de ı a ´ datos adicional al arbol de an´ lisis sint´ ctico. o o ØÝÔ . Ganamos en sencillez.4.) y no como informacion en el nodo. lo insertamos en la Tabla de S´mbolos.1 El uso de estructuras externas para almacenar los atributos Existen algunos atributos de especial importancia cuyos valores se utilizan en diferentes puntos durante la compilaci´ n. que almacena atributos asoa a ciados a la declaraci´ n de constantes. En vez de almacenar el tipo de cada variable en el arbol de an´ lisis a sint´ ctico. tablas. Es cono o o veniente tenerlos almacenados de forma f´ cilmente accesible (en variables a ´ globales.

As´. a Teorema: Dada una gram´ tica de atributos.5. modificaciones a la gram´ tica (siempre a ı a generando el mismo lenguaje) pueden dar lugar a que el c´ lculo de los a atributos sea m´ s sencillo. ØÝÔ Î Ö Ä ×Ø ØÝÔ ØÝÔ Î Ö Ä ×ؾ ØÝÔ Î Ö Ä ×ؽ ØÝÔ Î Ö Ä ×ؾ ØÝÔ Î Ö Ä ×Ø ØÝÔ ÌÝÔ ØÝÔ ÌÝÔ ØÝÔ ÒØ ÖÓ ÌÝÔ ØÝÔ Ö Ð Reglas sem´ nticas a .166 6. TEOREMA DE KNUTH (1968) 6.5 TEOREMA DE KNUTH (1968) El tipo de atributo ( y por tanto su m´ todo de evaluaci´ n) depende de e o la estructura de la gram´ tica. Por ejemplo: Dada la gram´ tica para generar declaraciones en C (recordea mos que el tipo era un atributo heredado): Producci´ n o Ð ÌÝÔ Î Ö Ä ×Ø Î Ö Ä ×Ø ØÝÔ ÌÝÔ ØÝÔ ÌÝÔ ÒØ ÌÝÔ ØÝÔ ÒØ ÖÓ ÌÝÔ ­Ó Ø ÌÝÔ ØÝÔ Ö Ð Î Ö Ä ×ؽ Î Ö Ä ×ؾ ØÝÔ Î Ö Ä ×ؽ ØÝÔ Î Ö Ä ×ؾ ØÝÔ Î Ö Ð ×ؽ ØÝÔ Î Ö Ä ×Ø ØÝÔ Î Ö Ä ×Ø ØÝÔ Se puede reescribir de la forma: Producci´ n o Reglas sem´ nticas a Ð Î Ö Ä ×Ø Î Ö Ä ×ؽ Î Ö Ä ×ؾ id Î Ö Ä ×Ø ÌÝÔ ÌÝÔ ÒØ ÌÝÔ ­Ó Ø . todos los atribua tos heredados pueden convertirse en atributos sintetizados por transformaci´ n de la gram´ tica sin modificar el lenguaje genero a ado.

´ Este teorema es menos util de lo que parece. Los problemas con la a ı evaluaci´ n de los atributos suelen ser un s´ntoma de un mal dise˜ o de la o ı n ˜ gram´ tica.´ ´ TEMA 6. la mejor soluci´ n es rehacer su diseno modificando la sintaxis. a para convertir atributos heredados en sintetizados. aqu´ siempre el valor se transmite una vez (no ı recursivo) de un padre a una hoja (que no lo transmite a nadie) y por tanto no es visto como atributo heredado. A primera vista se podr´a suponer que el atributo ØÝÔ sigue siendo ı heredado. Para la entrada float x. y. Los cambios en la gram´ tica. a menudo hacen que las reglas sean m´ s complejas y dif´ciles de entender. Sin embargo. a o . ANALISIS SEMANTICO 167 Decl VarList VarList type=real Type type=real float type=real type=real id (y) id type=real (x) .

trad=” ” num T.trad “+” E’½ .6. Se trata de una gram´ tica independiente del a contexto (que representa el lenguaje fuente) con un atributo que representa el c´ digo traducido y las reglas sem´ nticas correspondientes para realizar o a la traducci´ n.trad = T. Ejemplo: un ETDS que traduce expresiones en notaci´ n infija a postfija.trad “-” E’½ .T E’½ E’.T trad="1" E’ trad=" " epsilon trad="32+1-" E’ trad="2+1-" T trad="2" E’ trad="1-" num trad="1" ØÖ es un atributo sintetizado (las acciones se ejecutan al final de la pro- .trad ¯ E’. ESQUEMAS DE TRADUCCION DIRIGIDOS POR LA SINTAXIS (ETDS) ´ 6. o o (El s´mbolo indica concatenaci´ n de cadenas).trad = T. La evaluaci´ n del atributo (suele ser un atributo sintetizado) o o se realiza durante el propio proceso de an´ lisis sint´ ctico. o E E’ E’ E’ T T E’ E. y almacena la expresi´ n traducida.trad=num.168 ´ 6.6 ESQUEMAS DE TRADUCCION DIRIGIDOS POR LA SINTAXIS (ETDS) Un esquema de traducci´ n dirigido por la sintaxis (ETDS) permite trao ducir un lenguaje en otro. de ah´ que se les a a ı llame dirigidos por la sintaxis. El atributo lo llamaremos ı ØÖ .trad E’. E T trad="3" + num trad="3" num trad="2" .val Para la entrada 3+2-1.trad = T.trad + T E’½ E’.trad .

o . recorrido postfijo.´ ´ TEMA 6. ANALISIS SEMANTICO 169 ducci´ n).

trad=’float’ T.trad T.trad=’var’ V. var c: array[0.9 ] of integer " T trad="integer" V trad="c: array[0.trad= ’array [0..trad=’integer’ T.’ V.4] of array [0..trad ’.. int V’ trad="array[0. Gram´ tica b´ sica: a a S TV.trad Para la entrada int c[10].9] of" [ num ] 10 V’ trad=" " epsilon . var e: char.trad = id.9] of" id c .. S trad="var c: array[0.trad V’.6.lexema ’:’ V’.trad=’char’ V’½ .. var d: array[0. ESQUEMAS DE TRADUCCION DIRIGIDOS POR LA SINTAXIS (ETDS) Ejemplo: traducci´ n de declaraci´ n de variables de C a Pascal. V id V’ V’ [num] V’½ V’ ¯ T int T float T char S.val-1 ’] of’ V.’ num.trad=’ ’ T. char e..9] of integer . float d[5][6].5] of real. Por ejemo o plo las cadenas: int c[10]..170 ´ 6..

funciones y tipos. tipo de o o o o variable y tipo de operaci´ n a realizar. ambito.). inserci´ n y borrado con bastante o frecuencia. u ´ tipo. variables. como en la comprobaci´ n de tipo a a o y con el m´ dulo de generaci´ n de c´ digo (direcci´ n de memoria. Otros mantienen tablas diferentes. .. variables.. ´ ¯ b´ squeda: para obtener informacion de un identificador (su nombre. Incluye informaci´ n sobre los tipos.7 LA TABLA DE SIMBOLOS ´ La Tabla de S´mbolos es despu´ s del arbol de an´ lisis sint´ ctico la principal ı e a a estructura de datos de un compilador. variables. Tambi´ n o e interacciona con el an´ lisis sem´ ntico. ¯ borrado: eliminaci´ n de declaraciones (de constantes. o La informaci´ n que se introduce en la Tabla de S´mbolos depende del o ı ´ ´ lenguaje. ANALISIS SEMANTICO 171 ´ 6. Ambos introducen informacion o o necesitan consultarla durante todo el proceso de la compilaci´ n.´ ´ TEMA 6. a pesar que hemos e a ´ retrasado su introducci´ n hasta ahora. Algunos lenguajes mantienen una unica Tabla de S´mbolos ı para todas las declaraciones: de constantes. funo ´ ciones o tipos) cuando nos salimos del ambito en que se aplican. . ambitos (scope) y posicion o ´ de memoria. El compilador utiliza la Tabla de S´mbolos para llevar un seguimiento de ı los identificadores (variables. tipos y funciones. ¯ inserci´ n: introducci´ n de la informaci´ n de declaraciones de cono o o stantes. La Tabla de S´mbolos interacciona ı con el analizador l´ xico y con el analizador sint´ ctico. Operaciones de consulta.) cuando aparece a lo largo del programa.. Se examina la Tabla de S´mbolos cada vez que se encuentra un ı identificador. tipos) que aparecen en el programa fuente. funciones.

¯ En los tipos: la estructura del tipo.7. o ¯ Procedimientos y funciones: tipo y n´ mero de argumentos. pero mayor o ı a rendimiento. pobre rendimiento en consultas a cuando el n´ mero de entradas es grande. La entrada se crea cuando aparece por primera vez el nombre. tipo de dato. que se ligar´ a los nombre durante la ejecuci´ n (variables est´ ticas o a o a din´ micas).1 Estructura de la Tabla de S´mbolos ı La estructura de datos elegida debe ser eficiente ante estas tres operaciones. o . ambito de aplicaci´ n.172 6. arboles B. n ı o deber´a ser muy grande para albergar cualquier programa fuente. campos. a ´ ´ Otras estructuras posibles son los arboles binarios de b´ squeda. expresi´ n de tipo). como el tipo de identificador (variable. n´ mero de par´ metros en o o u a funciones. arboles u ´ AVL. ambito (regi´ n del programa en la que tiene o validez). etc n ´ ¯ En las variables: su tipo. Es la que se utiliza en la pr´ ctica. tama˜ os. o ´ funci´ n. posici´ n de memoria. u ¯ Tablas de dispersi´ n: dif´cil de implementar. se rellena conforme se va conociendo a lo largo del proceso de an´ lisis sint´ ctico. aunque la informaci´ n asociada. etc. etc. Es util que se pueda aumentar din´ micamente el o a tama˜ o de la Tabla de S´mbolos durante la compilaci´ n. Aunque no se suelen utilizar por la complejidad de la ´ operaci´ n de borrado. ambito. En la pr´ ctica se utilizan: a ¯ Listas lineales: f´ cil de implementar. o incluso m´ s tarde como la posici´ n de memoa a a o ria. valor de u ´ retorno.7. m´ s espacio. De lo contrario. LA TABLA DE S´ IMBOLOS 6. a ¿ Qu´ informaci´ n se introduce? e o ¯ En las constantes: el valor. ı Cada entrada de la Tabla de S´mbolos corresponde a la declaraci´ n de un ı o nombre.

. Si el programa es de tama˜ o medio. tenemos ½¼¼¼¼¼¼ operaciones. se puede tener Ò ½¼¼ y ½¼¼¼.j. Si aumenta Ò y en un factor de 10. el coste para realizar Ò inserciones y realizar consultas es a n lo sumo Ò´Ò · µ. int i... Si se u a llega al comienzo y no se ha encontrado: fallo. char * j. . id 1 info 1 id 2 info 2 id n info n NIL disponible ´ ¿C´ mo se implanta la regla de ambito? o En un lenguaje estructurado por bloques. el coste se hace ya prohibitivo.. ı o Si la tabla contiene Ò entradas (s´mbolos).. ANALISIS SEMANTICO 173 La Tabla de S´mbolos como una lista enlazada ı Los identificadores se a˜ aden a la lista en el orden que aparecen.´ ´ TEMA 6. cuando se busca un identificador en la tabla debe devolverse la entrada adecuada. i integer j integer j char * NIL disponible . Coste consulta: O(n) Por tanto. Coste inserci´ n: O(n) (tenemos que buscar primero para ver que ese nombre no existe ya). La n b´ squeda se realiza hacia atr´ s desde el final hasta el comienzo.

El espacio ocupado aumenta con Ñ. Permite la realizaci´ n de consultas sobre n o Ò nombres en un tiempo proporcional a Ò Ò . ¯ Ñ listas enlazadas independientes unas de otras (algunas de las cuales pueden estar vac´as). si ı buscamos desde atr´ s. no hay l´mite en el n´ mero de entradas o ı u ´ que puede contener la tabla.7.174 6. LA TABLA DE S´ IMBOLOS Normalmente las entradas se insertan en orden en que aparecen. cuando aparezca un identificador en el programa y a lo busquemos en la Tabla de S´mbolos nos encontraremos primero con el ı que ha sido m´ s cercano. As´. el adecuado seg´ n la regla del anidamiento m´ s a u a cercano. donde Ñ es una constante Ñ elegida. La Tabla de S´mbolos como una tabla de dispersi´ n ı o Se considera la dispersi´ n abierta. ´ · µ Una tabla de dispersi´ n (Hash) est´ formada por: o a ¯ Una vector de punteros de tama˜ o Ñ indexado por un entero (cuben tas). ı Por ejemplo una tabla de tama˜ o 5: n Cubetas Índices 0 1 2 3 4 temp Listas de items i size j . Simplemente cuando se produce una colision ´ (dos identificadores con el mismo valor de la funcion de dispersi´ n) se o a˜ ade a la lista correspondiente. Compromiso entre tiempo de consulta y espacio.

Por 1 Cada car´ cter a ejemplo: su c´ digo ASCII. tempx. se le aplica la funci´ n de dispersion h(s). se puede demostrar que el tiempo para acceder a una entrada es pr´ cticamente constante. ANALISIS SEMANTICO 175 Para buscar un identificador de nombre la cadena × (clave de la tabla). o ½ ¾ ´ 2 Estos valores se combinan en un unico n´ mero entero. Una forma u posible es sumar los valores de los caracteres.m2tm Demasiadas colisiones. por ejemplo ¾. o . ¯ si cogemos todos y los sumamos directamente. . ı Ò La lista promedio consta de Ñ registros suponiendo que hay Ò identifiÒ e cadores en una tabla de tama˜ o Ñ. dividiendo Ñ y tomando el resto. Situaciones conflictivas: ´ ¯ si cogemos s´ lo algunos primeros o alguno ultimos. la funci´ n resto (mod) proporciona valores uniformemente distribuidos.´ ´ TEMA 6.m1tmp.xtemp o cualquier permutaci´ n. Consideraciones: es conveniente tomar todos los caracteres al calcular . n ¿ C´ mo dise˜ ar una funci´ n de dispersi´ n f´ cil de evaluar y que distribuya o n o o a los identificadores uniformemente entre las listas? se convierte en un entero positivo. que devuelve un entero entre ¼ y o ´ Ñ   ½. Para programas a de tama˜ o medio. 3 A partir de ese entero. Por ejemplo. y que es el ´ndice del puntero que apunta al inicio de la lista en la ı que se deber´a encontrar ese identificador. problemas porque o los programadores tienden a usar nombres como temp1. Por ejemplo. Se ha ´ o comprobado que si Ñ es un numero primo. Si se elige Ñ de modo que Ñ est´ n limitado por una constante. obtener un n´ mero comprendido entre ¼ y u Ñ   ½. un valor de Ñ de varios cientos es suficiente.temp2. problemas.

: procedimientos. Valores tipo de Ñ var´an entre varios cientos a mil. uniones y las clases en C++.. Por eje.).7. En lenguajes como Modula-2 es necesario una primera pasada independiente para construir la Tabla de S´mbolos. funciones. LA TABLA DE S´ IMBOLOS Soluci´ n: coger todos los caracteres y multiplicarlos por un peso funo ci´ n de su posici´ n en la cadena. . ı ¯ Estructura de bloque: un bloque es visto como cualquier construcci´ n que contiene declaraciones. Se puede incrementar din´ micamente en tiempo de compilaci´ n para a o programas muy extensos. Esta condici´ n permite o que la Tabla de S´mbolos se pueda construir durante el proceso de ı an´ lisis sint´ ctico y hacer las b´ squedas tan pronto como aparezca a a u el nombre y emitir el correspondiente mensaje de error en caso de ´ fallo. 128.. estructuras. o o ´«   · «   · ½ ¾ ½ ¾ ·«    ½ · µ ÑÓ Ñ Ñ ´ ½ « µ ÑÓ donde « potencia de 2 para que las multiplicaciones se implementen de ı forma eficiente (16.176 6. la declaraci´ n que se aplica es la del bloque anidado m´ s o a cercano. Hace factible los compiladores en unica pasada. ¯ Declaraci´ n antes de uso: declaraci´ n de los identificadores antes de o o ´ hacer referencias a el en el texto del programa. ´ Mantenimiento del ambito ´ Las reglas de ambito var´an de un lenguaje a otro. Dadas dos declaraciones con el mismo nombre en bloques anidados. pero hay varias que ı son comunes: declaraci´ n antes de uso y el anidamiento m´ s cercano para o a estructuras de bloque. o sentencias compuestas entre llaves.

. ANALISIS SEMANTICO 177 int i. ... double j.. temp.j.. 0 1 2 3 4 i (char) size (int) i (int) j (int) temp (char) f (function) Despu´ s de procesar la declaracion del cuerpo de e ´ 0 1 2 3 4 temp (char) f (function) i (char) j (char *) i (int) size (int) j (int) Despu´ s de procesar la declaracion de la segunda sentencia anidada dentro de e ´ 0 1 2 3 4 f (function) i (int) j (int) Despu´ s de salir de e . . . int f(int size) char i. char * j... ..´ ´ TEMA 6.

DeclFuncs Funcion DeclFuncs ¯ Funcion function id ( Arg LArg ): Type . Arg LArg ¯ Insts id = E . La operaci´ n borrado.178 6. para que la operaci´ n de b´ squeda. LA TABLA DE S´ IMBOLOS Para implementar la posibilidad de anidamientos. Insertar reglas sem´ nticas y arbol. Programa Decls . b=temp. la operaci´ n insertar no o ´ debe sobreescribir las declaraciones previas. Insts ¯ E id num E + E Para la entrada: var int a. function swap(int a. var int temp. Insts Decls DeclVars DeclFuncs DeclVars Variable DeclVars ¯ Variable var Type id . var int b. end A cada estructura de bloque se le asigna un nivel de anidamiento (profun´ didad). a . begin temp=a. sino que s olo debe ocultarlas temporalmente. Decls begin Insts end Type int float void Arg Type id Type * id LArg . int b):void.7. debe tambi´ n s´ lo boro a o e o ´ rar la m´ s reciente (el proceso de inserci´ n y borrado del ambito se puede a o asimilar al comportamiento de una pila). s´ lo encuentre la o u o declaraci´ n m´ s reciente. a=b.

la noci´ n de tipos y las reglas para a o asignar tipos a las construcciones del lenguaje.8. error tipo.1 Expresiones de tipos y su representaci´ n o Formalmente un tipo de dato es un conjunto de valores con ciertas opera´ ciones sobre ellos. La comprobaci´ n de tipos se puede realizar o junto con el proceso de an´ lisis sint´ ctico en la mayor´a de lenguajes. sintáctico árbol sintáctico comprobador de tipos árbol sintáctico generador código intermedio representación intermedia Tabla de Simbolos 6. ´ El dise˜ o de un comprobador de tipos se basa en informaci on acerca de las n construcciones sint´ cticas del lenguaje. real. indexacion de s´ lo variables o o definidas como matrices..: llamada o ´ a una funci´ n con argumentos adecuados. Por eje. ´ 3 Un constructor de tipo aplicado a expresiones de tipo es una expresi on de tipo. char. Cadena de componentes léxicos anal. o Clases de expresiones de tipo: 1 Un tipo b´ sico: boolean. En a a ı otros es necesario una pasada adicional (Ada) independiente. El tipo de una construccion del lenguaje lo denotaremos mediante una expresi´ n de tipo: un tipo b´ sico o el resultado de la o a aplicaci´ n de un constructor de tipos a otras expresiones de tipo. a ´ 2 El nombre de un tipo es una expresion de tipo... Constructores: . ANALISIS SEMANTICO 179 ´ 6.´ ´ TEMA 6. integer.8 COMPROBACION DE TIPOS ´ Un comprobador de tipos tiene como funcion asegurar que el tipo de una construcci´ n coincida con el previsto en el contexto.

var-decl var-decl id : type-exp simple-type structured-type int bool real char void array [num] of type-exp record var-decls end union var-decls end pointer to type-exp proc ( type-exps ) type-exp type-exps . ´ Las expresiones de tipos se representan mediante arboles. ½ ¾ ½ ¾ ¯ registros: record ( Ì ¢ ½ ¯ punteros: Si Ì es una expresi´ n de tipo. COMPROBACION DE TIPOS ¯ matrices: Si Ì es una expresi´ n de tipo. otro conjunto (el rango). nombres de tipos y variables de tipo. type-exp type-exp ¢ ÌÒ ) type-exps .180 ´ 6. ¯ funciones: transforma elementos de un conjunto (el dominio) a Ê. entonces su proo ducto cartesiano Ì ¢ Ì es una expresi´ n de tipo. ¯ productos: Si Ì y Ì son expresiones de tipo. entonces ÔÓ ÒØ Ö´Ì µ es o una expresi´ n de tipo que indica el tipo “apuntador a un objeto o de tipo T”.8. entonces ÖÖ Ý ´Á Ì µ es o una expresi´ n de tipo que indica el tipo matriz con elementos de o ı tipo Ì y el conjunto de ´ndices Á . Ejemplo de una sencilla gram´ tica para generar expresiones de tipo: a var-decls var-decl type-exp simple-type structured-type var-decls . 4 Las expresiones de tipo pueden contener variables cuyos valores son expresiones de tipo (para abordar el problema del polimorfismo de funciones). con nodos inte´ riores para los constructores de tipos y hojas para los b asicos.

Un sistema de tipos: es una serie de reglas para asignar expresiones de tipos a las distintas construcciones del lenguaje. a . Dos expresiones de tipo equivalentes tienen ´ arboles sint´ cticos con la misma estructura.2 Comprobaci´ n e inferencia de tipos o ´ Especificaci´ n de un comprobador de tipos sencillo: usaremos una gram atica o ´ de atributos con un atributo sintetizado que el es el tipo de cada expresion. de igual ı modo que las declaraciones de variables. ¿ Cuando son equivalentes dos expresiones de tipos? Equivalencia estructural: Dos expresiones son equivalentes si son el mismo tipo b´ sico o est´ n formadas aplicando el mismo constructor a tipos a a estructuralmente equivalente.8. Debe estar dotado de un mecanismo de recuperaci´ n de errores sem´ nticos. record var (x) pointer var (y) array (10) int real Las declaraciones de tipos se insertan en la tabla de s´mbolos. ANALISIS SEMANTICO 181 record x: y: end pointer to real. array [10] of int. a 6. Se dice que un lenguaje o a es fuertemente tipificado si su compilador puede garantizar que los programas que acepte se ejecutar´ n sin errores de tipo.´ ´ TEMA 6.

while (temp and p1!=NIL and p2!=nill) do if (!typeEqual(p1. temp=true.name) temp=false.child1)) temp=false.sibling.t2.child.8. return(temp and p1==NIL and p2==NIL and typeEqual(t1.182 ´ 6. elseif (!typeEqual(p1. if (t1 and t2) son tipos simples return (t1==t2). else return (false). elseif (t1. p1.kind. while (temp and p1!=NULL and p2!=NULL) do if (p1. temp=true. else p1=p1.sibling.child1.child1.child1.kind=proc and t2.kind==proc) p1=t1. p2=p2. t2 : temp:Boolean.t2.child1)).child. p2.child1. p2.size and typeEqual(t1.child2.child1.child1)) temp=false.size==t2.name!=p2.child1.child2)).kind==pointer) return (typeEqual(t1. p2=t2.child1). elseif (t1.t2.kind uniones) p1=t1. elseif (t1.kind==array and t2.kind==array) return (t1. .t2. t2. TypeExp) : Boolean return (temp and p1==NIL and p2==NILL).kind.sibling. p2=t2.kind==pointer and t2. COMPROBACION DE TIPOS Algoritmo para la comprobacion de equivalencia estructural ´ function typeEqual(t1. p2=p2.sibling. else p1=p1. elseif (t1.kind records o t1.p2:TypeExp.

tipo) Type exp=array(num.tipo=if (Exp.tipo==integer and Exp½ .tipo=busca(id.tipo) then vac´o ı else error tipo Stmt.tipo else error tipo Stmt. Decls Decls id : Type exp Type exp char Type exp int Type exp Type exp½ * Type exp array [ num ] of Type exp½ Exp num Exp id Exp Exp½ [ Exp¾ ] Reglas sem´ nticas a Exp Exp Stmt Stmt Stmt Stmt Exp½ ( Exp¾ ) * Exp½ id = Exp if Exp then Stmt½ while Exp do Stmt½ Stmt½ .val.tipo==s and Exp½ ==s ’ ’ t ) then t else error tipo Exp. Stmts Decls Decls .tipo else error tipo Stmt. a o Producci´ n o Program Decls .tipo= integer Type exp.tipo==array(s. pero se les puede asignar el tipo especial vac´o.tipo= if (Stmt½ .tipo==vac´o) then vac´o ı ı ı else error tipo Tabla 6.tipo= if (Exp¾ .tipo==E.t)) then t else error tipo Exp.tipo=if (Exp. Stmt¾ a˜ adetipo(id.Type exp½ ) Exp.lexema.tipo= if (Exp¾ .tipo==vac´o and Stmt¾ .tipo= if (id.1: Gram´ tica de atributos para la comprobaci on e inferencia de tipos a ´ Las sentencias carecen de tipos.´ ´ TEMA 6.tipo=integer Exp.tipo==boolean) then Stmt½ . ANALISIS SEMANTICO 183 Inferencia de tipos Obtenci´ n de los tipos de las construcciones del lenguaje a partir de las o reglas sem´ nticas que especifican c´ mo se combinan.tipo= if (Exp½ . o .tipo==boolean) then Stmt½ .tipo=pointer (Type exp½ .tipo= char Type exp.tipo==pointer(t)) then t else error tipo Stmt.tipo) n Type exp. Type exp.lexema) Exp. que permite la propagaci´ n de errores y la implementaci´ n de ı o o reglas para la recuperaci´ n.

tipo==real and Exp¾ . eje.tipo=busca(id.tipo==real) then real elseif (Exp½ .8. un entero a un real). las reglas para la a conversi´ n ´mplicita de entero a real ser´an: o ı ı Producci´ n o Exp id Exp num int Exp num real Exp Exp½ op Exp¾ Reglas sem´ nticas a Exp. OTRAS COMPROBACIONES SEMANTICAS Y RECUPERACION DE ERRORES SEMANTICOS 6. Se dice que la conversi´ n es expl´cita si el programador debe escribir algo o ı para motivar la conversi´ n (un cast). asignaci´ n de tipos incompatibles. o La conversi´ n ´mplicita se puede implementar con las correspondientes o ı reglas sem´ nticas.tipo=integer Exp. llamadas a funciones con o tipos no adecuados.3 Conversi´ n de tipos o Se dice que la conversi´ n de tipos es ´mplicita si el compilador la realiza o ı autom´ ticamente (se les llama tambi´ n coerciones).9. Se limitan a situaa e ´ ciones en donde no se pierde informacion (p.9 OTRAS COMPROBACIONES SEMANTICAS Y RECUPERACION ´ DE ERRORES SEMANTICOS Dentro de las comprobaciones estaticas (en el momento de la compilaci´ n).tipo==integer) then integer elseif (Exp½ .tipo==real) then real else error tipo op + . . o ´ tenemos la detecci´ n e informaci´ n de errores como: o o ¯ Comprobaciones de tipos: operadores aplicados a operandos incompatibles. etc.184 ´ ´ ´ 6.lexema) Exp.tipo==real and Exp¾ . Por eje: si tenemos enteros y reales.tipo= if (Exp½ .* ´ ´ 6.tipo==integer and Exp¾ .tipo==integer) then real elseif (Exp½ .tipo==integer and Exp¾ .tipo=real Exp.

´ ¯ Comprobaciones de unicidad: situaciones en las que s olo se puede ´ definir un objeto una vez exactamente. cuando se introduce un o identificador en la Tabla de S´mbolos. S´ lo nos hemos centrado en las comprobaciones de tipo. las etiquetas case dentro de un tt switch. ı . ANALISIS SEMANTICO 185 ¯ Comprobaciones de flujo de control: las sentencias que hacen que el flujo de control abandone una construcci on debe tener alg´ n lugar a u ´ donde transmitir el control. Las otras son en o cierto modo rutinarias y se pueden realizar facilmente insertando acciones intercaladas en el c´ digo para realizarlas. Por ej: un identificador.´ ´ TEMA 6. for o switch en C. Por ejemplo: unbreak debe estar dentro de una proposicion while. por eje.

se ha invertido el or´ den de los d´gitos. o ÈÖÓ Ö Ñ Ä ×Ø Ð Ä ×Ø × ÒØ Ä ×Ø Ð Ð Ä ×Ø Ð ¯ Ð ÚÖ Ä ×Ø × ÒØ × ÒØ Ä ×Ø × ÒØ ¯ Ë ÒØ Ð Ö × Ö Ö ÒÙÑ · .25 ptos. Indica a el orden de evaluaci´ n de los atributos. Por ejemplo. qui´ n sabe) los ordenadores han pasado de trabajar con cae denas de d´gitos ¼ y ½ a trabajar con la letra para representar el ı ¼ y la letra para representar el ½. EJERCICIOS 6.10. Se desea dise˜ ar un ETDS que realice esta traduccion n en ´ ´ usando la gramatica base: ´ Ë ¼ ¼ Ë Ë ½ ½ 3 (0.) Supongamos la siguiente gram atica que permite gener´ ar n´ meros enteros binarios.2 ptos.2 ptos. Construye el arbol de an´ lisis sint´ ctico para la cadena ½½¼½ y a a ´ Æ Æ ½ ¼ ejecuta las reglas sem´ nticas para encontrar su valor decimal. o 2 (0. declaraci´ n de variables e instrucciones de e o asignaci´ n y de entrada y salida. Disena una gram´ tica de atributos u a ˜ para convertir un numero binario entero a un numero decimal en´ ´ tero. la cadena ´¼¼½½½µ se ha convertido ı µ.186 6. Ademas.) No se sabe debido a qu´ extra˜ o efecto (quiz´ el efecto e n a 2000.10 EJERCICIOS 1 (0.) La siguiente gramatica genera un sencillo lenguaje con ´ expresiones aritm´ ticas.

Existen declaraciones ´ de variables de tipos de datos simples (enteros y reales) y tipos de datos compuestos (vectores). el atributo que indica el tipo de la variable es un atributo heredado. ANALISIS SEMANTICO 187 A˜ ade las reglas semanticas y los atributos necesarios para: n ´ ¯ Obtener el n´ mero de variables declaradas y una lista con el u nombre de cada variable. o 4 (0. escribir b .2 ptos. ¯ Obtener el valor num´ rico de las expresiones.2 ptos. var a.´ ´ TEMA 6.) Dise˜ a una gram´ tica de atributos que calcule el tipo de n a las declaraciones para la siguiente gram atica. b := a a + a . a . Construir el arbol de an´ lisis a ´ sint´ ctico para la entrada x. var b. Transformadla para que el tipo sea ahora un atributo sintetizado. leer a. e ¯ Construye el arbol de an´ lisis sint´ ctico para la siguiente entraa a ´ da indicando las dependencias entre los atributos y un posible ordenamiento de los nodos del arbol en el grafo de dependen´ cias.y:char para ambos casos.) Dada la siguiente gramatica que permite generar declara´ ciones de variables tipo Pascal. Suponed que el operador potencia tiene mayor precedencia que el de adici´ n y es asociativo a la derecha. Ì Ä Á ÌÄ Ä Á Á Á ÒÙÑ ÒØ Ö Ð 5 (0.

La idea de esta gram atica es que la u ´ operaci´ n de divisi´ n se ha de interpretar de forma diferente depeno o diendo de si se trata de numeros enteros o reales. mientras que el significado de o ¾ ¾ es ½. si se trata de una division en punto ´ ´ flotante o entera. Una a a primera pasada que calcula el valor del atributo × ÐÓ Ø. Por ejemplo: la expresi´ n ¾ ¾ ¼ es ½ ¾ . EJERCICIOS Ì Ä Ä Ì Ä ÒØ Ö Ö 6 (0. Un atributo booleano × ÐÓ Ø que indica si aparece un operando que tiene un valor en coma flotante. Por ejemplo: 5/4 ´ puede tener el valor ½ ¾ o ½. Se pide: ¯ Insertar las reglas semanticas necesarias para que se puedan ´ distinguir entre estos dos tipos de operaciones.10.188 6. o ¯ ¿ De qu´ tipo de atributos se trata? e ¯ Justifica por qu´ es necesario dos recorridos sobre el arbol de e ´ an´ lisis sint´ ctico para calcular el valor de los atributos. Dibuja el grafo de dependencia para la a expresi´ n 5/2/2. Y otra que calcula ØÝÔ y Ú Ð.0. ÜÔ ÜÔ ÜÔ ÒÙÑ ÒØ ÒÙÑ Ö Ð Supongamos un lenguaje de programaci on que requiere que las op´ eraciones en las que aparecen numeros enteros combinados con reales ´ tienen que ser promocionadas a expresiones en punto flotante. Ayuda: se necesitan tres atributos.3 ptos. .) Supongamos la siguiente gram atica que genera divisiones ´ de n´ meros enteros y reales. otro atributo ØÝÔ que indica el tipo de una subexpresion (int o real) ´ y un atributo Ú Ð para almacenar el valor de la expresi on. ´ ¯ Dibuja los grafos de dependencias de cada una de las producciones de la gram´ tica.

v=B. ´ 8 (0.u=S. (2 (1 nil nil) (3 nil nil)) est´ a ordenado y (1 (2 nil nil) (3 nil nil)) no lo esta.0. o . C.u B.v.u. ¿ Cu´ l es el valor de Ë Ú cuando acaba la evaluacion?.v=2*A.u.v.u C.u=S.v.v=A. A. 7 (0.u=B.v=2*A. Por ejemplo.u-2 ¿ Cu´ l es el valor de Ë Ú despu´ s de la evaluaci´ n de los atributos si a e o Ë Ù ¿ cuando comienza la evaluaci´ n?.u C. S.v+C.v A. (b) ´ Sup´ n que a Ë Ù se le asigna el valor ¿ antes de que comience la o evaluaci´ n.v+C. A. dibuja ´ el grafo de dependencias y define un ordenamiento topol ogico.v=A. es decir.2 ptos) Considera la siguiente gram atica para generar arboles bi´ ´ narios: ØÖ ´ ÒÙÑ Ö ØÖ ØÖ µ ÒÐ Dise˜ a una gram´ tica de atributos que compruebe si un arbol binario n a ´ est´ ordenado.v A.u=A.v=B. que los valores de los n umeros del primer a ´ sub´ rbol son menor o igual que el valor del n umero actual y que a ´ todos los valores del subarbol segundo son mayores o iguales que ´ el actual. ANALISIS SEMANTICO 189 ¯ Escribe el pseudoc´ digo de los procedimientos necesarios para o el calculo de estos atributos.u B.2 ptos) Considera la siguiente gram atica de atributos: ´ S A B C ABC a b c B. S.v=C. o a ´ (c) Considera que las ecuaciones se modifican de la forma: S A B C ABC a b c B. Describe las dos pasadas para el calculo de los atributos sobre el arbol generado para la entrada ´ 5/2/2.´ ´ TEMA 6.u=B.v=1 (a) Dibuja el arbol de an´ lisis sint´ ctico para la entrada a a .

1. Tipo fun void int float L F Lista fun Lista fun . Usar como gramatica base: ´ S L T T id L . En la gramatica para la comprobaci´ n de tipos mostrada o ´ en la Tabla 6. a˜ ade las producciones y las reglas sem anticas necen ´ sarias para que puedan existitr expresiones de tipo booleano (oper). Argu LArgu ¯ Argu Tipo id Tipo * id Tipo int float Algunos ejemplos: . Usar como gramatica base: ´ S Tipo fun L .c: integer.e: real.2 ptos).190 6. or. var d. float d. EJERCICIOS 9 (0.10. not) y tipo relacional ( 10 (0.b.e.b. id L ¯ int float char Algunos ejemplos: Original Traducido int a. var a.2 ptos) Dise˜ a un ETDS para traducir declaraciones de funciones n en C a Pascal.c.2 ptos) Dise˜ a un ETDS para traducir declaraciones de variables n en C a Pascal. F Lista fun ¯ F id ( A ) A void Argu LArgu LArgu . adores and. . 11 (0.

. var b:integer):integer. function g(a:real. j(void). procedure j. int *b). void h(int a. procedure h(a:integer. function f:integer.´ ´ TEMA 6. float *c). g(float a. var c:real). function f(a:integer):real. ANALISIS SEMANTICO 191 int f(void). float f(int a).

Sign up to vote on this title
UsefulNot useful