Sunteți pe pagina 1din 35

CUADERNO DIDACTICO N Borrador ANALISIS SEMANTICO EN PROCESADORES DE LENGUAJE (Borrador) Juan Manuel Cueva Lovelle Catedrtico de E.U.

de Lenguajes y Sistemas Informticos Departamento de Informtica U niversidad de Oviedo Noviembre-2000 (Borrador)

Anlisis semntico en procesadores de lenguaje 1 INTRODUCCION Se entiende por semntica como el conjunto de reglas que especifican el significad o de cualquier sentencia sintcticamente correcta y escrita en un determinado leng uaje. En los apartados siguientes se estudiarn las distintas formas de especifica r sintcticamente los lenguajes de programacin y la forma de llevarlas a cabo dentr o del procesador de lenguaje. 2 ESPECIFICACIONES SEMANTICAS DE LOS LENGUAJES DE PROGRAMACION Existen dos formas para describir las especificaciones semnticas de un lenguaje d e programacin: especificacin natural y especificacin formal. La especificacin natura l de la semntica de un lenguaje de programacin, se basa en utilizar el lenguaje na tural para especificar las caractersticas semnticas del lenguaje. La especificacin formal puede dividirse en dos grandes grupos: - especificacin por medio de gramtic as atribuidas o gramticas con atributos. - utilizacin de metalenguajes de especifi cacin semntica. 2.1 Especificacin natural o informal La especificacin natural de la semntica de un lenguaje de programacin es describir mediante un lenguaje natural sus caractersticas semnticas, que no sean deducibles de la gramtica BNF que describe sintcticamente el lenguaje. El analizador semntico deber comprobar las especificaciones semnticas relatadas en lenguaje natural y las especificaciones semnticas derivadas de la sintaxis del lenguaje de programacin. 2.1.1 Compatibilidad de tipos La compatibilidad de tipos (type checking) es la principal especificacin semntica derivada de la sintxis del lenguaje. 2.1.2 Rutinas semnticas Las especificaciones semnticas descritas en lenguaje natural, no tienen reglas fi jas para ser implementadas en el analizador semntico. Normalmente, lo que se hace es incorporar rutinas (procedimientos o funciones) denominadas semnticas, que co mprueban las especificaciones descritas en lenguaje natural. Dependiendo de la c omplejidad de la especificacin, unas veces estas rutinas semnticas sern verdaderos procedimientos o funciones, y en otros casos sern simplemente algunas sentencias intercaladas entre las especficas del anlisis sintctico. 2.2 Especificacin formal La especificacin formal de los aspectos semnticos de los lenguajes de programacin s e basa en la definicin metamatemtica, y no en la definicin por medio del lenguaje n atural. Es, por tanto, una especificacin mucho ms precisa, sin embargo requiere el uso de unas herramientas que pueden dividirse en dos grandes grupos: - Gramticas atribuidas o con atributos. - Lenguajes de especificacin semntica. -1-

Anlisis semntico en procesadores de lenguaje 2.2.1 Gramticas atribuidas o gramticas con atributos Las gramticas con atributos o atribuidas, fueron definidas originalmente por Knut h (1968) para definir las especificaciones semnticas de los lenguajes de programa cin. Una gramtica atribuida se caracteriza por: 1.- La estructura sintctica del len guaje se define mediante una gramtica libre de contexto. 2.- Cada smbolo de la gra mtica, tiene asociado un conjunto finito de atributos. Ejemplo: <SIMBOLO>.a.b.c s iendo a, b y c atributos. Cada atributo puede tomar un conjunto de valores (posi blemente infinito). El valor de un atributo describe una propiedad dependiente d el contexto del smbolo en cuestin 3.- Cada regla de produccin debe de especificar c omo se modifican los atributos con su aplicacin. 4.- Una gramtica atribuida descri be un sublenguaje (del lenguaje definido) mediante las condiciones de contexto q ue deben ser cumplidas por los valores de los atributos. Una sentencia sintcticam ente correcta tambin lo ser semnticamente si y slo si todos los atributos satisfacen las condiciones del contexto. El principal problema del proceso de gramticas atr ibuidas, es que el tiempo necesario para realizar las comprobaciones semnticas cr ece exponencialmente con el nmero de atributos. 2.2.2 Lenguajes de especificacin semntica Los lenguajes de especificacin semntica son un caso particular de los mtodos formal es para desarrollo de software [FRAS94]. Los lenguajes de especificacin semntica s e pueden dividir en dos grandes grupos orientados a definir un modelo y orientad os a definir propiedades. 2.2.2.1 Lenguajes orientados a definir un modelo Estn construidos con independencia de las primitivas, ya sean estas concretas o a bstractas. Las ventajas de usar lenguajes orientados a definir un modelo, estrib an en que la existencia de un modelo asegura la consistencia de la especificacin, y que el modelo puede generar sugerencias al implementador. Por otra parte, la existencia de un modelo incrementa la probabilidad de que un sistema sea impleme ntable en un sistema fsico concreto. Las desventajas son por un lado que el uso d e un modelo restringe y limita al implementador y, por otro, que puede admitir ms informacin de la estrictamente necesaria para describir las propiedades de la ab straccin que se est considerando. El primero de los lenguajes orientados a definir un modelo es el VDM (Vienna Develpment Method) usado para describir lenguajes m ediante semntica denotacional. Posteriormente se desarroll el HDM ( " Hierarchical Development Method ") basado en la especificacin de programas para distintos niv eles de abstraccin de una mquina dada [LEVI79]. -2-

Anlisis semntico en procesadores de lenguaje 2.2.2.2 Lenguajes orientados a definir propiedades En este tipo de lenguajes, las especificaciones se indican en trminos de axiomas que definen las relaciones entre cada operacin, no definiendo, por tanto, ni tipo s de datos ni valores. El ejemplo ms conocido es el mtodo algebraico de especifica cin de tipos abstractos de datos. Las ventajas del mtodo algebraico son: - No infl uye ni restringe al implementador. - Facilita la comprobacin de la correcta descr ipcin de las propiedades. Los inconvenientes del mtodo algebraico son: - Menor fac ilidad de construccin. - Dificultad para expresar el comportamiento de un error. - Dificultad para expresar la consistencia de una especifiacin. Los lenguajes uti lizados son PROLOG, IOTA y ANNA (ANNotated Ada) 2.2.2.3 Metodologas de desarrollo de software Los lenguajes anteriormente mencionados pueden incorporar herramientas auxiliare s y metodologas de apoyo al anlisis, diseo y desarrollo de software. En estos casos , el lenguaje de especificaciones semnticas, tambin se utiliza como lenguaje de pr ogramacin para el desarrollo de software. Ejemplos: VDL, VDM, ANNA, GYPSY, HDM, . .. 2.2.2.3.1 VDL (Vienna Definition Language) Una de las primeras experiencias para desarrollar una especificacin formal comple ta (lxica, sintctica y semntica) de un lenguaje de programacin fue desarrollada en l os laboratorios de Viena de IBM con la especificacin formal del lenguaje PL/I (Lu cas y Walk 1969). Se utiliz la notacin denominada VDL (Vienna Definition Language) . 2.2.2.3.2 VDM (Vienna Development Method) Se comenz a desarrollar en los laborato rios IBM de Viena en 1970, de ah su nombre, es una variante de la semntica denotac ional. Es una metodologa de desarrollo de software con fuerte base matemtica y for mal. VDM no est relacionado con VDL, pese a la conexin de Viena. Se caracteriza po r: - Construye mtodos formales abstractos de las especificaciones. - Emplea una nota cin formal matemtica basada en los principios de la semntica denotacional. - Cualqu ier procedimiento se escribe utilizando tipos abstractos de datos, y con riguros as especificaciones. - Cualquier sistema a desarrollar en VDM se divide en tres partes: - entradas - un estado que puede cambiar en respuesta a las entradas - s alidas -3-

Anlisis semntico en procesadores de lenguaje - El modelo formal de cualquier sistema, consta de tres apartados: 1. Dominios s intcticos, son abstracciones de las entradas. 2. Dominios semnticos, corresponden a las abstracciones del estado. 3. Funciones semnticas, son las abstracciones de los cambios de estado y de las posibles salidas. Se ha utilizado en desarrollo d e bases de datos, definicin de la semntica de lenguajes y para el desarrollo de co mpiladores (PL/I, Ada,...). 2.2.2.3.3 HDM (Hierarchical Development Method) Se desarroll por SRI International como una herramienta de ayuda al desarrollo y mantenimiento del software. - Consta de: a) Un conjunto de reglas que describen las fases de desarrollo del software. b) Un conjunto de lenguajes. c) Un conjunt o de herramientas auxiliares. - La mayor parte de la notacin de HDM es el lenguaj e de especificaciones denominado SPECIAL, el cual se utiliza para describir los mdulos de un diseo. - SPECIAL es una notacin formal que permite definir los tipos d e los argumentos y de los valores devueltos por un procedimiento, as como el tipo de operacin realizada por el mismo. - Los procedimientos se agrupan en mdulos, y los mdulos en niveles de jerarqua de diseo. - El lenguaje SPECIAL permite la oculta cin de la informacin (information hiding) entre distintos niveles. - HDM requiere el desglose en una jerarqua de niveles del sistema a desarrollar. - Cada nivel se hace corresponder con una mquina abstracta. - Cada mquina abstracta est descompues ta en un conjunto de mdulos especificados en SPECIAL. - Las facilidades disponibl es en cada nivel estn implementadas utilizando las facilidades del nivel inmediat o inferior. - El nivel ms bajo o inferior es el que soporta las primitivas que se encuentran implementadas en el propio sistema fsico. - El nivel ms alto es el int erfaz con el usuario. 2.2.2.3.4 ANNA (ANNotated Ada) Es una extensin del lenguaje Ada, que incluye facilidades para la especificacin fo rmal de programas en todas las fases de desarrollo. - Un programa ANNA es bsicame nte un programa Ada con comentarios formales. - Los comentarios consisten en: texto virtual Ada - anotaciones -4-

Anlisis semntico en procesadores de lenguaje - Las anotaciones pueden ser: - anotaciones declarativas: para variables, subtip os, subprogramas, paquetes,... - anotaciones de sentencia - anotaciones de excep cin - anotaciones de visibilidad - ANNA incluye un pequeo nmero de atributos predef inidos, los cuales slo pueden aparecer en las anotaciones. - La estructura lxica d e ANNA est diseada de forma que las extensiones de Ada aparezcan como comentarios siendo aceptables por cualquier compilador de Ada. -- esto es un comentario en A da - La semntica de las anotaciones est definida en trminos de conceptos de Ada. De hecho, muchas anotaciones son generalizadas de conceptos restringidos. Ello sim plifica y facilita a los programadores de Ada la especificacin formal de sus prog ramas mediante el uso de ANNA. - El sistema ANNA intenta proporcionar una estruc tura en la cual diferentes teoras de especificacin formal puedan ser aplicadas al lenguaje Ada. - El sistema ANNA, como lenguaje de especificacin formal, se puede aplicar a otros lenguajes diferentes del Ada (Pascal, PL/I, Modula,...) aunque sl o se dispone de subconjuntos de ANNA. - Las herramientas de soporte que incluye el sistema ANNA son: - Analizador sintctico, editor estructurado y detector de ma nejador de errores y de inconsistencias entre especificaciones y cdigo. - Sistema de comprobacin en tiempo de ejecucin el cual traduce las especificaciones formale s en rutinas de chequeo Ada. - Sistema de verificacin formal. 2.2.2.3.5 GYPSY Se comenz a desarrollar en 1974 en la Universidad de Texas. Incluye: - metodologa - notacin (tipo Pascal) - lenguaje - herramientas auxiliares, para la especificac in y verificacin formal. - El GYPSY se puede usar tanto como lenguaje de especific acin como lenguaje de programacin. - Permite el desarrollo modular de programas. Facilita las tareas de validacin. -5-

Anlisis semntico en procesadores de lenguaje - La notacin es del tipo Pascal. - Permite la concurrencia (COBEGIN-COEND). - Per mite el manejo de excepciones o condiciones predefinidas o definidas por el usua rio. 3 GRAMATICAS CON ATRIBUTOS Una gramtica con atributos (o atribuida) es una gramtica de contexto libre a cuyos smbolos X (terminales y no terminales) se les asocia un conjunto de atributos. A dems a cada regla sintctica se le asocian unas reglas semnticas que especifican com o los atributos toman sus valores. 3.1 Atributos Un atributo es una variable que representa una determinada propiedad del smbolo X y que puede tomar un valor cualquiera dentro de un conjunto de valores posibles . Los atributos se denotan con un nombre precedido por un punto y el nombre del smbolo al que est asociado. Por ejemplo X.tipo, X.valor, etc... Al conjunto de atr ibutos asociados al smbolo X, se denotar por A(X). El atributo habitual en los com piladores es el tipo, sin embargo en los intrpretes puros se pueden tener dos atr ibutos: el tipo y el valor. 3.1.1 Ejemplo de atributos Sea una pequea gramtica libre de contexto para expecificar expresiones aritmticas y asignaciones de un intrprete. (1) <ASIGNACION> <VARIABLE> = <EXPRESION> (2) <EXP RESION> <EXPRESION> <OPERADOR> <EXPRESION> (3) <EXPRESION> nmero (4) <VARIABLE> i dentificador (5) <OPERADOR> + (6) <OPERADOR> Ejemplos de sentencias de este leng uaje son: c = 1+1, velocidad = 3.2 + 4 - 5.0, tocino = 4 - 5.1. Se pueden defini r los siguientes atributos: nmero.tipo nmero.valor <VARIABLE>.tipo <VARIABLE>.valo r <EXPRESION>.tipo <EXPRESION>.valor <OPERADOR>.tipo Tipo del nmero (entero o rea l) Valor que contiene el token nmero. Tipo de la variable Valor que toma la varia ble Tipo de la expresin Valor de la expresin despus de evaluarla Tipo del operador (entero o real) -6-

Anlisis semntico en procesadores de lenguaje <OPERADOR>.clase Clase del operador (adicin y sustraccin) El smbolo terminal identificador no tiene el atributo tipo en este ejemplo dado q ue no existe declaracin obligatoria de variables en esta gramtica. En el caso de u na gramtica con declaraciones obligatorias, en la zona de declaraciones es donde los identificadores reciben el atributo tipo. 3.2 Reglas semnticas Los valores que toman los atributos se establecen en funcin de un conjunto de reg las semnticas que estn asociadas a cada una de las reglas sintcticas. Al conjunto d e reglas semnticas asociado al conjunto de reglas sintcticas P se denominar R(P). L as reglas semnticas se definen en funcin de los atributos de los dems smbolos que co mponen la regla y otras posibles acciones. Dado que los smbolos de una gramtica pu eden definirse recursivamente y repetidamente en las reglas sintcticas de la gramt ica, las reglas semnticas los distinguen por medio del uso de subndices numerados de izquierda a derecha de las reglas. En las reglas tambin pueden incluirse otras acciones como cambiar de tipo, imprimir, etc... que se denominarn acciones semnti cas. Adems de las reglas semnticas existe un conjunto de condiciones semnticas que se ejecutan sobre los atributos y que se denominarn B(P). Cada smbolo de la gramtic a corresponde a un nodo del rbol sintctico de una sentencia del lenguaje generado por la gramtica. Los smbolos terminales se corresponden con las hojas del rbol. En una gramtica con atributos los nodos y las hojas del rbol tambin contienen los atri butos, que se evaluarn teniendo en cuenta las reglas semnticas. 3.2.1 Ejemplo de reglas y condiciones semnticas Continuando con la gramtica del ejemplo 3.1.1, se puede ampliar la gramtica dada c on las siguientes acciones y reglas semnticas para construir un intrprete puro de dicha gramtica. (1) <ASIGNACION> <VARIABLE> = <EXPRESION> {<VARIABLE>.valor := <EXPRESION>.valor <VARIABLE>.tipo := <EXPRESION>.tipo} (2) <EXPRESION> <EXPRESION> <OPERADOR> <EX PRESION> { <OPERADOR>.tipo := mayor_tipo(<EXPRESION>2.tipo, <EXPRESION>3.tipo) < EXPRESION>1.tipo := <OPERADOR>.tipo if (<OPERADOR>.tipo==F && <EXPRESION>2.tipo==I) {<EXPRESION>2.tipo:=F; <EXPRESION>2.va lor:=FLOAT(<EXPRESION>2.valor);} if (<OPERADOR>.tipo==F && <EXPRESION>3.tipo==I) {<EXPRESION>3.tipo:=F; -7-

Anlisis semntico en procesadores de lenguaje <EXPRESION>3.valor:=FLOAT(<EXPRESION>3.valor);} switch (<OPERADOR>.tipo) { I: <EXPRESION>1.valor :=op_entera(<OPERADOR>.clase, <EX PRESION>2.valor, <EXPRESION>3.valor); break; F: <EXPRESION>1.valor :=op_real(<OPER ADOR>.clase, <EXPRESION>2.valor, <EXPRESION>3.valor); break; } } (3) <EXPRESION> nmero { <EXPRESION>.valor := nmero .valor <EXPRESION>.tipo := nmero.tipo } (4) <VARIABLE> identificador (5) <OPERADO R> + {<OPERADOR>.clase:=+} (6) <OPERADOR> - {<OPERADOR>.clase:=-}

Las funciones auxiliares utilizadas en las reglas semnticas se definen a continua cin. tipo Mayor_Tipo (char tipo1, char tipo2) { if (tipo1==tipo2) return tipo1; if (t ipo1==F || tipo2==F) return F; else return I; } int op_entera(char op, int valor1, in alor2) { switch (op) { +: return (valor1 + valor2); -: return (valor1 - valor2); } f loat op_real(char op, float valor1, float valor2) { switch (op) { -8-

Anlisis semntico en procesadores de lenguaje +: return (valor1 + valor2); -: return (valor1 - valor2); } Las funcin FLOAT convierte un entero en real. 3.2.2 Ejemplo de evaluacin de atributos mediante reglas semnticas Se utilizarn las reglas semnticas del ejemplo 3.2.1 para evaluar los atributos de la sentencia: velocidad = 80.5 + 20 Se construye el rbol sintctico con los atributos que se muestra en la figura 1. ASIGNACION VARIABLE valor tipo = EXPRESION 1 valor tipo identificador EXPRESION 2 valor tipo OPERADOR tipo clase EXPRESION3 valor tipo velocidad nmero valor tipo + nmero valor tipo 80.5 Figura 1. Arbol sintctico con atributos 20 El analizador lxico devuelve los tokens reconocidos con sus atributos: velocidad.identificador = 80.5.float + 20.int A partir de esta informacin los atributos se propagan segn las reglas y acciones s emnticas definidas en el apartado 3.2.1, obtenindose: <EXPRESION>2.valor:=80.5 <EX PRESION>2.tipo:=F <EXPRESION>3.valor:=20 <EXPRESION>3.tipo:=I <OPERADOR>.clase:=+ <OPE RADOR>.tipo:=F <EXPRESION>1.tipo:=F -9-

Anlisis semntico en procesadores de lenguaje <EXPRESION>3.tipo:=F <EXPRESION>3.valor:=20.0 <EXPRESION>1.valor:=100.5 <VARIABLE> .tipo:=F <VARIABLE>.valor:=100.5 3.3 Atributos heredados Se dice que un atributo en una determinada posicin del rbol es heredado si se calc ula mediante los atributos del padre o de los hermanos de dicho nodo. Al conjunt o de atributos heredados se denominar AH(x). 3.3.1 Ejemplos de atributos heredados Continuando con el ejemplo 3.2.2 son atributos heredados: <VARIABLE>.valor <VARI ABLE>.tipo <OPERADOR>.tipo 3.4 Atributos sintetizados Los atributos sintetizados se calculan a partir de los atributos de los nodos hi jos del rbol. Al conjunto de atributos sintetizados se denominar AS(x). Los smbolos terminales tan slo tienen atributos sintetizados, y es el analizador lxico quien se encarga de proporcionar los atributos. Adems se supone que el smbolo inicial no tiene ningn atributo heredado. 3.4.1 Ejemplos de atributos sintetizados Continuando con el ejemplo 3.2.2 son atributos sintetizados: <OPERADOR>.clase <E XPRESION>.valor <EXPRESION>.tipo nmero.tipo nmero.valor 3.5 Definicin formal de gramticas con atributos Una gramtica con atributos o atribuida es una cuadrupla formada por GA={G, A, R, B}, donde: G={VN,VT,S,P} es una gramtica libre de contexto A= U A(X) es el conjun to de atributos asociados a cada smbolo X de la gramtica (terminales y no terminal es). Un smbolo no puede tener el mismo atributo repetido, es decir los atributos de cada smbolo deben ser conjuntos disjuntos: Si A(X) A(Y) <> X = Y - 10 -

Anlisis semntico en procesadores de lenguaje R=U R(P) es un conjunto finito de reglas semnticas asociadas a cada una de las re glas P de la gramtica libre de contexto G. Si entre las reglas semnticas hay accio nes la gramtica atribuida pasa a denominarse Definicin atribuida o definicin dirigi da por sintaxis. Sea la regla p de la forma: X0 X1X2X3...Xn entonces las reglas semnticas asociadas a p son de la forma: a:=f(a1,a2,a3,...,an) donde f es una fun cin y a,ai son atributos de los smbolos de la regla que componen p. B=U B(P) es un conjunto de condiciones asociado a cada una de las reglas P de la gramtica libre de contexto G. Sea la regla p de la forma: X0 X1X2X3...Xn entonces las condicio nes semnticas asociadas a p son de la forma: g(a1,a2,a3,...,an) donde g es una fu ncin booleana y a,ai son atributos de los smbolos de la regla que componen p. 3.5.1 Definicin formal de atributos calculados Sea la regla p de la forma: X0 X1X2X3...Xn se define AC(p) como el conjunto de a tributos calculados mediante la regla p: AC(p)={X1.a / X1.a=f(...) pertenece a R (p)} 3.5.2 Definicin formal de atributos sintetizados Dada una gramtica con atributos, se dice que un atributo a asociado es sintetizado si existe una regla sintctica de la forma X y un e c lcul con los tributos de los smbolos de l p rte derech de Al conjunto de tributos sintetiz dos se denomin r AS(x). AS(X)={X. teneciente P y X. pertenece AC(p)} a un smbolo X regl semntic qu dich regl . /Existe X per

3.5.3 Definicin form l de tributos hered dos D d un gr mtic con tributos, se dice que un tributo soci do un smbolo X es hered do si existe un regl sintctic de l form Y X y una regla semntica que c alcula a con los atri utos del resto de los sm olos que forman la regla. Al conju nto de atri utos heredados se denominar AH(x). AH(X)={X.a/Existe Y X perteneciente a P y X.a pertenece a AC(p)} - 11 -

Anlisis semntico en procesadores de lenguaje

3.5.4 Gramtica con atri utos completa Se dice que una gramtica con atri utos es completa si cumple las cuatro condicion es siguientes para todo sm olo X. Para toda regla p: X AS(X) est incluido en AC(p) P r tod regl q: Y X AH(X) est incluido en AC(q) AS(X) U AH(X) = A(X) AS(X) A ) = 3.5.5 Gramticas con atri utos ien definidas Una gramtica con atri utos est ien definida si para toda sentencia L(G) todos los atri utos pueden ser calculados. A este proceso se denomina evaluacin de la gramt ica. Una sentencia del lenguaje se dice que tiene todos sus atri utos correctos si adems cumplen todas las condiciones B(p) asociadas a las reglas se verifican. 3.5.6 Teorema de las gramticas ien definidas Toda gramtica con atri utos ien definida es completa. 3.6 Gramticas S-atri uidas Se dice que una gramtica S-atri uida si slo contiene atri utos sintetizados. 3.6.1 Evaluacin ascendente de gramticas S-atri uidas Toda gramtica S-atri uida puede ser evaluada mediante anlisis ascendente. Es neces ario ampliar la pila del analizador de forma que se almacenan juntos los sm olos y los atri utos. Dado que tan slo se utilizan los sm olos de la parte derecha de c ada produccin con lo que se pueden realizare los calculos simultneamente a las red ucciones que se efectuan en la pila. 3.7 Gramticas L-atri uidas Se dice que una gramtica es L-atri uida si todo atri uto heredado asociado a un sm olo Xj aparece en la parte derecha de alguna regla de la gramtica A X1X2X3...Xn depende solamente de: los atri utos (sintetizados o heredados) de los sm olos de la parte derecha de la produccin situados a su derecha (X1X2X3...Xj-1) los atri u tos heredados de A Puede o servarse que la definicin impone restricciones a los a tri utos heredados de Xj, pero no hay restricciones para los atri utos sintetiza dos. Por tanto, toda gramtica S-atri uida es tam in L-atri uida.

3.7.1 Evaluacin descendente de gramticas L-atri uidas Se pueden evaluar grmticas L-atri uidas de forma simultnea al anlisis LL(1). Cada f uncin asociada a cada sm olo no terminal tendrn como argumentos los atri utos hered ados correspondientes al sm olo no terminal, y devolveran los atri utos sintetiza dos asociados al sm olo no terminal. - 12 -

Anlisis semntico en procesadores de lenguaje 3.8 Esquemas de traduccin atri uidos Un esquema de traduccin atri uido es una gramtica atri uida en la cual las reglas semnticas aparecen intercaladas entre los sm olos de la parte derecha de la produc cin, indicando as el momento que de en ser ejecutadas. Es decir son de la forma: A {R0} X1 {R1} X2 {R2} X3...Xn {Rn} donde Ri representa una o varias acciones semn ticas. 3.8.1 Esquemas de traduccin atri uidos ien definidos Para que un esquema de traduccin atri uido est ien definido de e cumplir las sigu ientes condiciones: (condiciones siguientes) Un atri uto heredado asociado a un sm olo en la parte derecha de una regla, de e ser evaluado antes de que se emplee la produccin correspondiente a dicho atri uto. Una regla semntica asociada a una produccin sintctica no de e hacer referencia a los atri utos sintetizados asociado s a la parte izquierda de dicha produccin. Un atri uto sintetizado asociado a un sm olo terminal situado en la parte izquierda de una regla de e ser evaluado desp us de que hayan sido evaluados todos los atri utos de los que el dependa. Con est as tres condiciones se garantiza que es posi le realizar una correcta evaluacin d el esquema de traduccin, y por tanto que la gramtica atri uida su yacente est ien definida. Tam in puede demostrarse que a partir de toda gramtica L-atri uida es po si le o tener un esquema de traduccin ien definido. Un esquema de traduccin ien definido asociado a una gramtica S-atri uida tiene solamente reglas de la forma: A X1 X2 X3...Xn {Rn} Rn:={A.sk :=f(Xi.si)} 3.9 Generador de compiladores asado en gramticas atri uidas El desarrollo del sistema GAG se realiz intentando satisfacer tres premisas: - Co nstruccin de un sistema til y prctico para la generacin de compiladores. - Construcc in de un sistema capaz de procesar definiciones formales de lenguajes por medio d e gramticas atri uidas, en vez de especificaciones en lenguaje natural. - Constru ir evaluadores de atri utos eficientes. El lenguaje de entrada al GAG, se llama ALADIN (A Language for Attri uted DefINition) y est asado en principios de gramti cas atri uidas. La salida del generador es el cdigo del compilador escrito en Pas cal. Gramtica Atri uida del lenguaje (en ALADIN) GAG compilador (en Pascal) Figura 2. - 13 -

Anlisis semntico en procesadores de lenguaje El sistema GAG ha conseguido resultados satisfactorios incluso con lenguajes de alta complejidad como el ADA, con uenas prestaciones en cuanto a las necesidade s de memoria y el tiempo de ejecucin. La evaluacin de los atri utos, se realiza po r medio de un autmata de pila, y se hace partiendo del r ol sintctico construido tr as el anlisis del texto fuente. Cada nodo del r ol representa a un descendiente de l sm olo inicial tras aplicarle las distintas reglas de produccin. Las reglas semnt icas se evalan al pasar por cada nodo. Una secuencia del anlisis semntico sera: - Ev aluar una regla semntica so re los atri utos. - Compro ar las condiciones de cont exto. - Pasar al siguiente nodo hijo (descendiendo). - Li erar al nodo padre. La siguiente fase es la traduccin a Pascal de las reglas introducidas en ALADIN. Mu chas de las expresiones en ALADIN de en de descomponerse en varias sentencias de Pascal, utilizndose a veces varia les temporales para los resultados intermedios . Algunos operadores de ALADIN de en de ser traducidos como llamadas a procedimi entos y funciones del lenguaje Pascal. Por otra parte el cdigo emitido en Pascal de e de cumplir: - No se de en violar las normas de tipos en Pascal. - Legi ilid ad. De e de formatearse y usarse identificadores lo ms parecidos posi les a los u sados con ALADIN. La salida del GAG incluye adems del cdigo generado: - mensajes d e error; - traza; - ta la de referencias cruzadas; - listado de las vas de depend encia entre los atri utos seleccionados. Los principios de la implementacin del s istema GAG han sido: a) MODULARIDAD. Cada fase est compuesta por mdulos. ) TRANSP ORTABILIDAD. Se ha desarrollado en Pascal y genera cdigo tam in en Pascal. c) TOLE RANCIA A FALLOS. Contiene una verificacin de todas las conexiones entre mdulos y u n sistema de tratamiento de errores en todas las fases del sistema. - 14 -

Anlisis semntico en procesadores de lenguaje 4 COMPATIBILIDAD DE TIPOS 4.1 Introduccin Un compilador de e verificar que el programa fuente sigue las convenciones sintct icas y semnticas del lenguaje. Esta verificacin, denominada COMPROBACION ESTATICA (para distinguirla de la compro acin dinmica que se realizara durante la ejecucin de l programa o jeto), asegura que ciertos tipos de errores pueden ser detectados e indicados al programador. Ejemplos de compro aciones estticas son: a) COMPATIBIL IDAD DE TIPOS. Un compilador de e de indicar un error si un operador se aplica a un operando incompati le, por ejemplo, si se desea sumar una varia le de tipo v ector con un identificador de funcin. ) COMPROBACION DEL CONTROL DE FLUJO. Las s entencias que producen la variacin del flujo de un programa de en verificar hacia donde se transfiere el control de flujo. Por ejemplo, la sentencia reak del le nguaje C hace que el control de flujo a andone el ucle while ms interior o una s entencia switch; aparecer un error se tal ucle no existe. c) COMPROBACION DE LA UNICIDAD. Existen situaciones en las cuales un o jeto slo se define una vez. Por ejemplo, en Pascal un identificador de e de declararse una sola vez, las etiquet as de la sentencia case de en de ser distintas, y los elementos de un tipo enume rado no de en de repetirse. d) COMPROBACION DE IDENTIFICADORES CORRESPONDIENTES. Algunas veces, el mismo identificador de e aparecer dos o ms veces. Por ejemplo, en Ada o en Modula-2, un loque o procedimiento tiene un identificador que apar ece al comienzo y al final de la construccin. El compilador de e verificar que el mismo identificador aparece en am os lugares. En este apartado se estudiar la co mpro acin de tipos en profundidad. La mayora de los compiladores de Pascal realiza n en un solo paso: - anlisis sintctico; - compro acin de tipos; - generacin de cdigo intermedio. Sin em argo en lenguajes ms complejos, como por ejemplo el Ada, es co nveniente realizar la compro acin de tipos en un paso separado, tal y como se mue stra en la figura 2: r ol sintctico r ol sintctico a stracto cadena de tokens ANALISIS SINTACTICO COMPROBACION DE TIPOS GENERADOR DE CODIGO INTERMEDIO cdigo intermedio Figura 2 - 15 -

Anlisis semntico en procesadores de lenguaje La compro acin de tipos verifica que los tipos utilizados en un determinado conte xto son los apropiados. Por ejemplo, una construccin con el operador MOD del leng uaje Pascal exige que am os operandos sean de tipo integer. De igual forma que l a compro acin de tipos de e verificar que se utilizan slo ndices con varia les del tipo array, o que una funcin definida por el ususario mantiene la correspondencia entre el nmero y tipo de parmetros declarados con los utilizados en la llamada. E n este apartado se mostrar la construccin de un pequeo modelo de compro acin de tipo s. Tam in se plantear el pro lema de la equivalencia entre tipos y la conversin de tipos. La informacin recogida por la compro acin de tipos, puede necesitarse para la generacin de cdigo. Por ejemplo, el operador aritmtico +, ha itualmente, se util iza para representar la adicin entre enteros y reales, pero tam in se utiliza en o casiones so re otros tipos de datos como string (concatenacin), conjuntos (unin),. .. En este caso es necesario examinar el contexto para determinar el significado del operador y consecuentemente generar el cdigo correspondiente. Un sm olo que p uede representar diferentes operaciones en diferentes contextos se dice que est s o recargado (overloaded). La so recarga puede acompaarse de tipos inducidos, cuan do un compilador o liga a un operando a convertirse al tipo esperado por el cont exto (si es posi le). Otro concepto deiferente a la so recarga de operadores es el concepto de polimorfismo. El cuerpo de una funcin polimrfica puede ejecutarse c on argumentos de varios tipos. 4.2 Sistemas de tipos El diseo del mdulo de compro acin de tipos para un determinado lenguaje de programa cin se asa en distintos aspectos: - las construcciones sintcticas del lenguaje; la nocin de tipos; - las reglas para asignar tipos a las construcciones del leng uaje. Por ejemplo en Pascal, su manual de referencia indica: "Si los dos operand os de los operadores aritmticos adicin, sustraccin y multiplicacin son del tipo ente ro, entonces el resultado es de tipo entero." En cam io en los lenguajes C y FOR TRAN, tam in de e aadirse el operador divisin. Otro ejemplo en C, es el siguiente: "El resultado del operador unario & es un puntero al o jeto referenciado por el operando. Si el tipo del operando es ..., el tipo del resultado es puntero a ..." Co mo conclusin a los ejemplos anteriores es que cada expresin tiene un tipo asociado con ella. Adems los tipos pueden construirse, por ejemplo el tipo puntero a ... es un tipo construido a partir de ... y referido a l. - 16 -

Anlisis semntico en procesadores de lenguaje En los lenguajes C y Pascal, los tipos pueden ser sicos o construidos. Los tipos sicos son aquellos cuya estructura interna no puede ser modificada por el progr amador. En Pascal los tipos sicos son: oolean, carcter, entero y real. Tam in se tratan como tipos sicos los tipos su rango, y los tipos enumerados. El lenguaje Pascal permite al programador construir tipos a partir de los tipos sicos o de o tros tipos construidos con arrays, registros y conjuntos. Adems, los punteros y l as funciones pueden tratarse tam in como tipos construidos. Expresiones de tipo ( type expresion) El tipo de una construccin de un lenguaje puede denominarse type expresion (expresin de tipo). Intuitivamente, una expresin de tipo es cualquier ti po sico o formado por aplicacin de un operador, denominado constructor de tipos, a otra expresin de tipo. El conjunto de tipos sicos y tipos construidos depende d el lenguaje a compro ar semnticamente. En este li ro se utilizarn las siguientes d efiniciones de expresiones de tipo: 1. Un tipo sico es un tipo de expresin. Entre los tipos sicos se encuentran oolean, char, integer y real. Un tipo sico espec ial, es el tipo_error, que indicar un error durante la compro acin de tipos. Final mente el tipo sico void que indica la ausencia de valor. 2. Tam in se pueden nom rar las expresiones de tipo, un nom re de tipo es una expresin de tipo. 3. Un con structor de tipos aplicado a expresin de tipo, es una expresin de tipo. Los constr uctores de tipos son: a) arrays: si T es una expresin de tipo, entonces array(I,T ) es una expresin de tipo que indica el tipo de un array con elementos de tipo T y su ndices I. I es a menudo un rango de enteros. Por ejemplo, en Pascal, la decl aracin: VAR a: ARRAY [1..10] of integer asocia a a la expresin de tipo array(1..10 ,integer) con a. )productos: Si T1 y T2 son expresiones de tipos, entonces su p roducto cartesiano T1xT2 es una expresin de tipos. Se supone que x es asociativo por la izquierda. c)registros: el tipo de un registro es, en sentido estricto, e l producto de los tipos de sus campos. La diferencia entre un registro y un prod ucto es que los campos del registro tienen nom res. Por ejemplo, una ta la de sm olos puede construirse segn la estructura: TYPE fila = RECORD direccion: integer; atri utos: ARRAY [1..15] OF char END; VAR ta la_sim olos: ARRAY [1..101] OF fila; La compro acin de tipos en el caso de registros puede realizarse usando una expre sin de tipos formada al aplicar el tipo constructor registro al duo formado por l os nom res de los campos y sus nom res asociados. RECORD ( (direccion x integer) x (atri utos x array[1..15,char) ) Se pueden presentar algunos errores de progr amacin: - 17 -

Anlisis semntico en procesadores de lenguaje VAR x: RECORD p_real: real; p_imag: real END; y: RECORD p_imag: real; p_real: re al END; La asignacin de X a Y o de Y a X dar resultados semticamente errneos si la asignacin se hace miem ro a miem ro, aunque sea correcta segn la estructura. d) punteros: s i T es una expresin de tipo, entonces puntero(T) es una expresin de tipo denominad a puntero a un o jeto de tipo T. Por ejemplo: la declaracin del lenguaje Pascal: VAR p: fila declara una varia le p de tipo puntero (fila). e) funciones: matemticamente una f uncin es una aplicacin entre dos conjuntos, el conjunto inicial o dominio, y el fi nal denominado rango. f: D R Por ejemplo la funcin mod del lenguaje Pascal tiene como dominio integer x integer (un par de enteros) y como rango integer. As se ti ene que: mod: integer x integer integer1 Otro ejemplo es la declaracin de la sigu iente funcin en Pascal FUNCTION fa rica (a, : char): integer; donde: fa rica: char x char puntero (integer) A menudo, por razones de implement acin, se limitan los tipos que puede devolver una funcin; por ejemplo, no se suele permitir que devuelvan arrays o funciones. Sin em argo, existen lenguajes, como el LISP, que permiten a las funciones devolver o jetos ar itrarios, as se puede definir una funcin g de la forma: g: (integer integer) (integer integer) es decir g toma como argumento una funcin que devuelve un entero, y produce como resultad o otra funcin del mismo tipo. 4. Las expresiones de tipo pueden contener varia le s cuyos valores son tam in expresiones de tipo. SISTEMAS DE TIPOS Un sistema de t ipos es un conjunto de reglas para asignar expresiones de tipo a varias partes d el programa. La compro acin de tipos implementa un sistema de tipos. 1 Se supone que x tiene ms precedencia que (es asociativa por la derecha) - 18 -

Anlisis semntico en procesadores de lenguaje Pueden utilizarse diferentes sistemas de tipos en distintos compiladores de un m ismo lenguaje de programacin. Por ejemplo, en Pascal, el tipo array incluye el co njunto de ndices del array. Sin em argo, muchos compiladores o ligan a especifica r el tamao del array cuando se pasa como su ndice. As, estos compiladores usan dife rente sistema de tipos que el usado en la definicin del lenguaje. De forma simila r, en el sistema operativo UNIX, el comando lint usca en los programas en C los posi les gazapos con ms detalle que el compilador de C. COMPROBACION ESTATICA Y DINAMICA DE TIPOS La compro acin de tipos en tiempo de compilacin se denomina estti ca, mientras que la compro acin en tiempo de ejecucin se denomina dinmica. En princ ipio, cualquier compro acin puede realizarse dinmicamente, si el cdigo o jeto trans porta el tipo de un elemento con el valor del elemento. Un sistema de tipos puro elimina la necesidad de la compro acin dinmica, dado que determina todos los erro res en tiempo de compilacin. Es decir, un sistema de tipos puro con tipo "tipo_er ror" a una zona de un programa, y no permite que se ejecute ste. Un lenguaje se d ice fuertemente tipeado si su compilador puede garantizar que los programas que acepta pueden ejecutarse sin errores. En la prctica, algunas compro aciones de en realizarse siempre en tiempo de ejecucin. Por ejemplo, si se declara: VAR vector: ARRAY [0..256] OF char; i: integer; y se calcula vector[i], un compilador no puede garantizar, en general, durante l a ejecucin del programa que el valor de i est comprendido entre 0 y 255. TRATAMIEN TO DE ERRORES Una vez que se ha detectado un error en la compro acin de tipos, es necesario indicarlo al programador, sealando su naturaleza y localizacin. ESPECIF ICACION DE UN COMPROBADOR DE TIPOS ELEMENTAL Sea un lenguaje de programacin en el cual es o ligatorio declarar todos los identificadores antes de ser usados. Se pretende construir un compro ador de tipos de este lenguaje, asado en sintetiza r el tipo de una expresin a partir del tipo de sus su expresiones. La gramtica del lenguaje es la siguiente: <P> sm olo inicial Producciones <P> ::= <D> ; <E> - 19 -

Anlisis semntico en procesadores de lenguaje <D> ::= <D> ; <D> | id : <T> <T> ::= char | integer | array [num] of <T> | <T> <E > ::= literal | num | id | <E> mod <E> | <E> [ <E> ] | <E> donde <D> representa l as declaraciones <T> representa a los tipos <E> representa a las expresiones Un ejemplo de programa en esta gramtica es el siguiente: clave: integer; clave mod 1999 El lenguaje tiene dos tipos sicos: char e integer. Tam in existe un tercer tipo i nterno, el tipo_error, usado para indicar errores. Para simplificar se supone qu e los arrays comienza en 1, as: array [256] of char es una expresin de tipo array (1..256,char), donde el constructor de tipos array se ha aplicado al su rango 1. .256 y al tipo char. Al igual que el lenguaje Pascal, el operador prefijo en la zona de declaraciones construye un tipo puntero, por ejemplo: integer es una expresin del tipo puntero(entero), donde el constructor se aplic al tipo en tero. Sea el siguiente esquema de traduccin, que corresponde slamente a la parte d e declaraciones: <P> <D> ; <E> <D> <D> ; <D> <D> id : <T> <T> char <T> integer < T> <T1> <T> array [num] of <T1> { aade_tipo(id.entrada, T.tipo) } { T.tipo:= char } { T.tipo:= integer } { T.tipo:= puntero(T1.tipo) } { T.tipo:= array(1..num.val ,T1.tipo) } * La primera produccin ( <P> <D> ; <E> ) asegura que todos los identificadores se an declarados antes de que se construyan expresiones. * La segunda produccin (<D> <D> ; <D> ) permite realizar mltiples declaraciones. - 20 -

Anlisis semntico en procesadores de lenguaje * La accin asociada con la produccin ( <D> id : <T> ) almacena el identificador "i d" en la ta la de sm olos asignndole el tipo <T>. Esta accin se puede indicar por: aade_tipo(id.entrada, T.tipo) donde tipo es un atri uto del no terminal <T>. * Si <T> deriva a char o integer, entonces T.tipo se define como char o integer resp ectivamente. * De igual forma se tra aja con el resto de los tipos. * El lmite su perior de los su ndices del array se o tiene con el atri uto val de num. COMPROBA CION DE TIPOS EN EXPRESIONES En las siguientes reglas se muestra la compro acin d e tipos en expresiones: <E> literal <E> num <E> id <E> E1 mod E2 { E.tipo:= char } { E.tipo:= integer } { E.tipo:= consulta(id.entrada) } { E.tipo:= if E1.tipo= integer and E2.tipo= integer then integer else tipo_error } <E> E1 [E2 ] { E.ti po:= if E2.tipo= integer and E1.tipo= array(s,t) then t else tipo_error } <E> E1 { T.tipo:= if E1.tipo= puntero(t) then t else tipo_error } * Se utiliza la funcin consulta(e) para que usque en la ta la de sm olos el tipo de la entrada e. COMP ROBACION DE TIPOS DE SENTENCIAS A diferencia de las expresiones, las sentencias no son en general de ningn tipo. Se les puede asignar el tipo void (vaco) si estn c orrectas, o el tipo_error si incumplen la regla semntica. En este ejemplo se cons iderarn las sentencias de asignacin, las condicional y la sentencia repetitiva whi le. Las secuencias de sentencias se separan por un punto y coma. Para tener en c uenta a las sentencias de e de aadirse a la gramtica de reglas: <P> <D> ; <S> ( su stituye a <P> <D> ; <E> ) <S> <S> ; <S> | <S> Otras reglas, y sus compro aciones semnticas son: - 21 -

Anlisis semntico en procesadores de lenguaje <S> id := <E> { S.tipo:= if id.tipo= E.tipo then void else tipo_error } <S> if < E> then <S1> { S.tipo:= if E.tipo= oolean then S1.tipo else tipo_error } <S> wh ile <E> do <S1> { S.tipo:= if E.tipo= oolean then S1.tipo else tipo_error } <S> <S1> ; <S2> { S.tipo:= if S1.tipo= void and S2.tipo= void then void else tipo_er ror } COMPROBACION DE TIPOS DE FUNCIONES La produccin <E> <E> ( <E> ) representa a una funcin de un solo argumento, en la cual una expresin es la aplicacin de una e xpresin en ora. Las reglas para asociar expresiones de tipo con no terminales <T> pueden aumentarse con la siguiente produccin: <T> <T1> <T2> { T.tipo:= T1.tipo T2. tipo } las comillas son para diferenciar al constructor de funciones del metasm olo que indica produccin. La regla para compro ar el tipo de una llamada a una funcin es: <E> <E1> ( <E2> ) { E.tipo:= if E2.tipo= s and E1.tipo= st then t else tipo_ error } Desde el punto de vista de la generalizacin a funciones de ms de un argume nto, puede indicarse que n argumentos de tipos T1, T2, ..., Tn pueden verse como un solo argumento de tipo T1xT2xT3x...xTn. 4.3 Equivalencia de expresiones de tipo Las reglas de compro acin de tipos anteriores son de la forma if dos expresiones de tipo son iguales then devuelve un cierto tipo else devuelve tipo_error. Parec e conveniente precisar la definicin de cuando dos expresiones son equivalentes. 4.3.1 Equivalencia por estructura de expresiones de tipo Se dice que dos expresiones de tipo tienen equivalencia por estructura si am as se forman con el mismo constructor de tipos. Ejemplo: TYPE VAR a: : c: MATRIZ= ARRAY [1..10] OF integer; MATRIZ; ARRAY [1..10] OF int eger; ARRAY [1..10] OF integer; - 22 -

Anlisis semntico en procesadores de lenguaje a, y c tienen equivalencia por estructura. Algoritmo para compro ar la equival encia por estructura (1) function expresionesEquivalentes(s,t): oolean; BEGIN ( 2) (3) (4) (5) if s y t de un mismo tipo sico then return true else if s= array( s1, s2) and t= array(t1, t2) then return expresionesEquivalentes(s1,t1) and expr esionesEquivalentes(s2,t2) (6) (7) else if s= s1 x s2 and t= t1 x t2 then return expresionesEquivalentes(s1,t1) and expresionesEquivalentes(s2,t2) (8) (9) (10) (11) else if s= puntero(s1) and t= puntero(t1) then return expresionesEquivalent es(s1,t1) else if s= s1 s2 and t= t1 t2 then return expresionesEquivalentes(s1,t 1) and expresionesEquivalentes(s2,t2) else (12) return false END 4.3.2 Equivalencia por identificador de expresiones de tipo En este tipo de equivalencia, se considera que dos o jetos son idnticos si son idn ticos los identificadores de tipo. Este tipo de equivalencia puede causar pro le mas en lenguajes que permiten asignar identificadores a los tipos. Por ejemplo, en el fragmento de programa en Pascal, donde celda es un tipo definido por el us uario: TYPE enlace= celda; VAR siguiente: enlace; anterior: enlace; p: celda; q,r: celda; siguiente, anterior, p, q ,r son del mismo tipo? Sorprendentemente la respuesta d epende de la implementacin, pues el lenguaje no define cuales son los tipos idntic os. - 23 -

Anlisis semntico en procesadores de lenguaje 4.3.3 Bucles en la representacin de los tipos Algunas estructuras de datos, como listas encadenadas y r oles, se definen frecue ntemetne de forma recursiva; as una lista encadenada puede ser vaca o es un nodo c on un puntero que seala a la lista. Estas estructuras de datos se implementan ha itualmente utilizando registros que contienen punteros que sealan a registros sim ilares, y los nom res de los tipos juegan un papel fundamental en la definicin de los tipos de tales registros. Ejemplo: Considrese una lista encadenada de celdas , cada una de ellas contiene una informacin que es un entero y un puntero que seal a a la siguiente celda en la lista. En Pascal se declarara de la siguiente forma: TYPE enlace= celda; celda= RECORD info: integer; siguiente: enlace END; Ntese que el tipo enlace se define en funcin de celda, y celda se define en funcin de enlace, as, estas declaraciones son recursivas. celda= RECORD x x x info integer siguiente enlace Figura 3: Definicin recursiva de CELDA En lenguaje C: struct celda { int info; struct celda *siguiente; }; 4.4 Conversin de tipos Sea la expresin x+i donde: x: real; i: integer En un principio el operador + real iza la adicin si am os operadores son del mismo tipo, en el caso de que no sean d el mismo tipo el lenguaje de e especificar que conversiones son necesarias. - 24 -

Anlisis semntico en procesadores de lenguaje En general se convierten los enteros a reales y se realiza la operacin real so re am os operadores reales. La compro acin de tipos puede ser utilizada para insert ar estas operaciones de conversin en la representacin intermedia del cdigo fuente. Por ejemplo, usando una notacin postfija, x+i se convierte en: x i inttoreal real + inttoreal real+ : convierte i de entero a real : realiza la adicin de dos opera ndos reales COERCIONES (cast) Una conversin de un tipo a otro se dice implcita si se realiza a utomticamente por el compilador. Las conversiones de tipo implcitas, tam ien se de nominan coerciones (coercions). Una conversin se dice explcita si el programador d e e escri ir alguna sentencia, funcin, ... para realizar la conversin. Ejemplos: a ) En Pascal, las funciones ord y chr convierten enteros a caracteres y viceversa . Conversin explcita. ) En C, se convierte implcitamente los caracteres ASCII a en teros entre 0 y 127 en expresiones aritmticas. Coercin. c) Sean las expresiones fo rmadas al aplicar el operador aritmtico op a constantes y operandos segn la gramtic a: PRODUCCION <E> num <E> num.num <E> id <E> <E1> op <E2> REGLA SEMANTICA E.tipo := integer E.tipo:= real E.tipo:= consulta(id.entrada) E.tipo:= if E1.tipo= inte ger and E2.tipo= integer then integer else if E1.tipo= integer and E2.tipo= real then real else if E1.tipo= real and E2.tipo= integer then real else if E1.tipo= real and E2.tipo= real then real else tipo_error d) La conversin implcita de cons tantes se realiza ha itualmente en tiempo de compilacin, pero tam in en algunos ca sos se realiza en tiempo de ejecucin. Por ejemplo, puede teclearse el siguiente cd igo en Pascal: FOR i:= 1 TO n DO x[i]:= 1; compro ar su tiempo de compilacin y de ejecucin. Modificar el fragmento anterior p or: FOR i:= 1 TO n DO x[i]:= 1.0 - 25 -

Anlisis semntico en procesadores de lenguaje y o servar los nuevos tiempos de compilacin, y de ejecucin. Si aumenta el tiempo d e compilacin, est claro que la conversin automtica se realiza en tiempo de compilacin . Si aumenta el tiempo de ejecucin se realiza en tiempo de ejecucin. 4.5 So recarga de funciones y operadores Un sm olo est so recargado (overloaded) si tiene diferentes significados segn su co ntexto. Por ejemplo en Matemticas el operador + est so recargado, dado que + en A+ B tiene diferentes significados en funcin de que A y B sean enteros, reales, nmero s complejos o matrices. Otro ejemplo es el parntesis () en Ada; la expresin A(I) p uede ser el I-simo elemento del array A, una llamada a la funcin A con el argument o I, o una conversin explcita de la expresin I a tipo A. La so recarga se resuelve cuando se determina el significado correcto del sm olo so recargado. Por ejemplo en la expresin: x + (i + j) el operador + puede indicar diferentes formas de adic in dependiento de los tipos de x, i y j. La resolucin de la so recarga en este cso se realiza identificando los operandos. Los operadores aritmticos estn so recarga dos en la mayora de los lenguajes. Sin em argo su resolucin se realiza o servando los tipos de los operandos. Las reglas semnticas a utilizar son las mismas que en el caso de <E1> op <E2> (apartado 4.4). 4.5.1 Conjunto de posi les tipos para una su expresin No siempre es posi le resolver la so recarga o servando slo los tipos de los oper andos, o los tipos de los argumentos de una funcin. Ejemplo: En Ada, una de las i nterpretaciones predefinidas del operador "*" es una funcin de una pareja de ente ros a un entero. El operador puede ser so recargado aadiendo declaraciones como l as siguientes: function "*"(i,j: integer) return complex; function "*"(x,y: complex) return com plex; Despus de estas declaraciones, los posi les nteger integer x integer complex complex x teger o complex, dependiendo del contexto. 2 (3 * 5) * z entonces (3 * 5) complex, si z - 26 tipos para * son: integer x integer i complex complex As: 3 * 5 puede ser in * (3 * 5) entonces (3 * 5) integer complex

Anlisis semntico en procesadores de lenguaje Hasta ahora se supona que cada expresin tena un nico tipo, y que la regla para la co mpro acin de tipos era de la siguiente forma: PRODUCCION <E> <E,> (<E2>) REGLA SE MANTICA { E.tipo:= if E2.tipo= 1 and E1.tipo= 1 t then t else tipo_error } Esta r egla semntica de e generalizarse al conjunto de posi les tipos de una expresin: PR ODUCCION <E> <E> <E> id <E> <E1> (<E2>) REGLA SEMANTICA { E.tipo:= E.tipo } { E.ti po:= consulta(id.entrada) { E.tipo:= { t/ existe un s { E2.tipo } tal que s t, t { E1.tipo } } } En este caso se supone que la ta la de sm olos puede contener el conjunto de posi les tipos. Puede reservarse el conjunto vaco, como un almacenamiento temporal de l tipo_error.

4.5.2 Reduccin del conjunto de posi les tipos El lenguaje Ada o liga a que una expresin completa tenga un tipo nico. Dado que se conoce el tipo de la expresin completa, se pueden reducir los tipos posi les en cada una de las su expresiones. Si en este proceso no resultase un tipo nico para cada su expresin se devolvera tipo_error. Antes de realizar la descomposicin desce ndente de una expresin en su expresiones, se pueden o servar los conjuntos de tip os posi les contruidos con las reglas semnticas del apartado anterior. Se muestra que cualquier tipo t { E.tipos } es un tipo facti le; por ejemplo es posi le es coger entre los tipos so recargados de los identificadores presentes en la expre sin E de tal forma que E tome el tipo t. Las propiedades asignadas a los identifi cadores en su declaracin hacen que cada elemento de id.tipos sea facti le. Existe n distintos caminos para llegar a que un tipo sea facti le. Por ejemplo, considre se la expresin f(x) donde f puede tener los tipos ac y c, y x puede tener los tipo s a y . Entonces, f(x) tiene tipo c pero x puede ser de tipo a y . Parece conv eniente por tanto modificar las reglas semnticas de la seccin anterior, introducie ndo dos nuevos tipos de atri utos nico y cdigo. - 27 -

Anlisis semntico en procesadores de lenguaje PRODUCCION <E><E> REGLAS SEMANTICAS E.tipos:= E.tipos E.nico:= if E.tipos then t else tipo_error E.cdig o:= E.cdigo <E>id E.tipos:= consulta(id.entrada) E.cdigo:= genera(id.lexema : E.nico) <E><E1>(<E2>) E.tipos:= {s/ s {E2.tipos} tal que ss {E1.tipos} } t:= E.nico S:= {s/s {E2.tipos} st {E1.tipos} } E2.nico:= if S={s} then s else tipo_error E1.nico:= if S={s} then st else tipo error E.cdigo:= E1.cdigo || E2.cdigo || genera(apply : E.nico) El atri uto nico indica que slo se admite este tipo, y se puede propagar de forma descendente de las expresiones a las su expresiones. El atri uto cdigo se utiliza para ayudar a la generacin de cdigo intermedio. 4.6 Funciones polimrficas Normalmente, los procedimientos y las funciones ejecutan las sentencias que form an su cuerpo con unos argumentos de tipo fijo. Los procedimientos y funciones po limrficas se pueden ejecutar cada vez con argumentos de diferente tipo. Tam in se puede hallar de operadores polimrficos. Ejemplo: El operador & en C se descri e c omo: "si el tipo del operando es ..., el tipo de resultado es puntero a ...". Dado q ue cualquier tipo se puede sustituir por ..., el operador & es polimrfico. Este apa rtado est dirigido a plantear los pro lemas de la compro acin de tipos para un len guaje con funciones polimrficas. Para qu sirven las funciones polimrficas? - 28 -

Anlisis semntico en procesadores de lenguaje Las funciones polimrficas tienen su principal utilidad en el manejo de estructura s de datos. Por ejemplo, puede ser conveniente tener una funcin que determine la longitud de una lista, sin tener que conocer como son los elementos de la lista, a continuacin se presenta cmo se podra hacer en Pascal. TYPE enlace= celda; celda= RECORD info: integer; siguiente: enlace END; FUNCTION longitud(lptr: enlace): integer; VAR lon: integer; BEGIN lon:= 0; WHILE lptr<>NI L DO BEGIN lon:= lon+1; lptr:= lptr.next END; longitud:= lon END; Sin em argo no se ha cumplido nuestro propsito dado que los lenguajes como el Pas cal o ligan a especificar completamente el tipo de los parmetros de la funcin. As e sta funcin de er de modificarse para calcular la longitud de una lista encadenada de reales. fun longitud(lptr)= if null(lptr) then 0 else longitud(t1(lptr))+1 Una funcin polimrfica en ML fun indica que es una funcin recursiva. null comprue a si la lista est vaca. t1 devuelve el siguiente elemento de la lista. Con el progra ma anterior en ML se puede calcular: longitud(["lunes","martes","miercoles"]); l ongitud([10,9,8,7]) El primer caso es una lista de cadenas, el segundo una lista de enteros. BIBLIOGRAFIA AHO86 Aho A.V. , R. Sethi and J.D. Ullman. Compilers: Principles, techniques, an d tools. Addison-Wesley, 1986. Versin castellana: Compiladores: Principios, tcnica s y herramientas. Addison-Wesley I eroamericana, 1990. CAST93 Castro J., Cucker F., Messeguer X., Ru io A., Solano L., Valls B. Curso de programacin. Ed. McGraw-H ill, 1993. - 29 -

Anlisis semntico en procesadores de lenguaje CUEV91 Cueva Lovelle, J. M. Lenguajes, Gramticas y Autmatas. Cuaderno Didctico n36, Dto. de Matemticas, Universidad de Oviedo, 1991. CUEV93a Cueva Lovelle, J. M. Anlisis lxico en procesadores de lenguaje. Cuaderno Didctico n4 8, Dto. de Matemticas, Universidad de Oviedo, 2 edicin, 1993. CUEV94 Cueva Lovelle J. M., M P. A. Garca Fuente, B. Lpez Prez, M C. Luengo Dez, y M. Alonso Requejo. Introduccin a la programacin estructurada y orientada a o jetos con Pasca l. Cuaderno Didctico n 69, Dto. de Matemticas, Universidad de Oviedo, 1994.

Cueva Lovelle, J.M. Conceptos sicos de Traductores, Compiladores e Intrpretes. Cu aderno Didctico n9, Dto. de Matemticas, Universidad de Oviedo, 4 Edicin, 1994. CUEV95 Cueva Lovelle, J.M. Anlisis sintactico en procesadores de lenguaje. Cuaderno Didct ico n 61, Dto. de Matemticas, Universidad de Oviedo, 2 Edicin, 1995. DAWE91 FRAS94 Dawes J. The VDM-SL reference guide. UCL Press, 1991. M.D. Fraser, K. Kumar, V.K . Vaishnavi. "Strategies for incorporating formal specifications in software dev elopment". Communications of the ACM, Vol. 37, No. 10, pp. 74-85, Octo er 1994. HEKM88 HOLU90 LEIV93 Hekmatpour S., Ince D. Software prototyping, formal methods and VDM. Addison-Wes ley, 1988. Holu A.I. Compiler design in C. Prentice-Hall, 1990. Leiva Vzquez J.A . y Cueva Lovelle J.M. Construccin de un traductor de lenguaje Eiffel a C++. Cuad erno didctico n 76. Departamento de Matemticas. Universidad de Oviedo, 1993. LEVI79 TREM85 WATT91 WATT93 Levitt K. et al. The HDM hand ook. SRI International, 1979. Trem lay J. P. and P .G. Sorenson. The theory and practice of compiler writing. Ed. McGraw-Hill, 1985 . Watt D.A. Programming Language Syntax and Semantics. Prentice-Hall, 1991. Watt D.A. Programming Language Processors. Prentice-Hall, 1993. - 30 -

CUEV94

Anlisis semntico en procesadores de lenguaje Ta la de Contenidos 1 INTRODUCCION ................................................................. ................................................................................ . 1 2 ESPECIFICACIONES SEMANTICAS DE LOS LENGUAJES DE PROGRAMACION ............. ..................... 2.1 Especificacin natural o informal ...................... ................................................................................ .......... 2.1.1 Compati ilidad de tipos ....................................... ............................................................................. 2. 1.2 Rutinas semnticas ........................................................... ................................................................. 2.2 Especifica cin formal ...................................................................... ............................................................ 2.2.1 Gramticas atri uidas o gramticas con atri utos ................................................ ............................. 2.2.2 Lenguajes de especificacin semntica .......... ................................................................................ ... 2.2.2.1 Lenguajes orientados a definir un modelo ........................... ................................................... 2.2.2.2 Lenguajes orientados a definir propiedades ......................................................... .................. 2.2.2.3 Metodologas de desarrollo de software ................ ................................................................. 2.2.2.3.1 VDL (Vienna Definition Language) ................................................... ......................... 2.2.2.3.2 VDM (Vienna Development Method) ............ .............................................................. 2.2.2.3.3 HDM (Hi erarchical Development Method) ................................................. ................ 2.2.2.3.4 ANNA (ANNotated Ada) ................................ ............................................................. 2.2.2.3.5 GYPSY .. ................................................................................ ....................................... 3 GRAMATICAS CON ATRIBUTOS ............. ................................................................................ ........................ 3.1 Atri utos ......................................... ................................................................................ ............................. 3.1.1 Ejemplo de atri utos ....................... ................................................................................ ................... 3.2 Reglas semnticas ........................................ ................................................................................ ................ 3.2.1 Ejemplo de reglas y condiciones semnticas ................ .................................................................... 3.2.2 Ejemp lo de evaluacin de atri utos mediante reglas semnticas ........................... ........................... 3.3 Atri utos heredados ............................ ................................................................................ ......................... 3.3.1 Ejemplos de atri utos heredados ................ ................................................................................ ....... 3.4 Atri utos sintetizados ............................................. ................................................................................ ..... 3.4.1 Ejemplos de atri utos sintetizados ................................. ................................................................... 3.5 Definicin formal de gramticas con atri utos .............................................. .............................................. 3.5.1 Definicin formal de atri uto s calculados ................................................................... ...................... 3.5.2 Definicin formal de atri utos sintetizados ......... .............................................................................. 3 .5.3 Definicin formal de atri utos heredados .................................... ..................................................... 3.5.4 Gramtica con atri uto s completa ..................................................................... ................................ 3.5.5 Gramticas con atri utos ien definidas ... ................................................................................ ........ 3.5.6 Teorema de las gramticas ien definidas .......................... ............................................................... 3.6 Gramticas S-a

tri uidas ...................................................................... ......................................................... 3.6.1 Evaluacin ascende nte de gramticas S-atri uidas ................................................... ........................ 3.7 Gramticas L-atri uidas ............................. ................................................................................ .................. 3.7.1 Evaluacin descendente de gramticas L-atri uidas ......... ................................................................ 3.8 Esquemas de traduccin atri uidos ........................................................... ................................................... 3.8.1 Esquemas de traduccin a tri uidos ien definidos ....................................................... .................... 3.9 Generador de compiladores asado en gramticas atri uidas ..................................................................... 4 COMPATI BILIDAD DE TIPOS ............................................................... ............................................................ 4.1 Introduccin .... ................................................................................ ............................................................. 4.2 Sistemas de ti pos ............................................................................ .............................................................. 4.3 Equivalencia de expresiones de tipo ......................................................... ................................................... 4.3.1 Equivalencia por estru ctura de expresiones de tipo ................................................... ....................... 4.3.2 Equivalencia por identificador de expresiones de t ipo ...................................................................... 4.3.3 Bucles en la representacin de los tipos ........................................ .................................................... 4.4 Conversin de tipos ..... ................................................................................ ................................................ 4.5 So recarga de funciones y o peradores ...................................................................... ................................... 4.5.1 Conjunto de posi les tipos para una su expresin ....................................................................... ..... 4.5.2 Reduccin del conjunto de posi les tipos ............................. ............................................................ 4.6 Funciones polimr ficas .......................................................................... ...................................................... 1 1 1 1 1 2 2 2 3 3 3 3 4 4 5 6 6 6 7 7 9 10 10 10 10 10 11 11 11 12 12 12 12 12 12 12 13 13 13 15 15 16 22 22 23 24 24 26 26 27 28 BIBLIOGRAFIA ................................................................... ................................................................................ .... 29 - ii -

Anlisis semntico en procesadores de lenguaje Ta la de figuras Fig. 1: Ar ol sintctico con atri utos ........................................... ............................................................................. Fi g. 1 ........................................................................... ................................................................................ ............... Fig. 2 ......................................................... ................................................................................ ................................. Fig. 3: Definicin recursiva de CELDA .......... ................................................................................ .......................... 9 13 15 24 - iii -

S-ar putea să vă placă și