La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Procesadores de Lenguaje

Presentaciones similares


Presentación del tema: "Procesadores de Lenguaje"— Transcripción de la presentación:

1 Procesadores de Lenguaje
Tema 5: Traducción Dirigida por la Sintaxis y Análisis Semántico © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

2 Procesadores de Lenguaje
Análisis léxico Introducción Traducción dirigida por la sintaxis Definiciones dirigidas por la sintaxis Comprobación de tipos © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

3 Procesadores de Lenguaje
Introducción © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

4 Procesadores de Lenguaje
Introducción Semántica. (Del griego semantikos, 'lo que tiene significado'). 1. Estudio del significado de los signos linguísticos y de sus combinaciones, desde un punto de vista sincrónico o diacrónico. 2. En la teoría lingüística generativa, componente de la gramática que interpreta la significación de los enunciados generados por la sintaxis y el léxico. Diccionario de la RAE © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

5 Procesadores de Lenguaje
Introducción Traducir. (Del lat. traducĕre, hacer pasar de un lugar a otro). 1. Expresar en una lengua lo que está escrito o se ha expresado antes en otra. 2. Convertir, mudar, trocar. 3. Explicar, interpretar. Diccionario de la RAE © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

6 Procesadores de Lenguaje
Introducción Para traducir una construcción de un lenguaje de programación, un compilador puede necesitar tomar en cuenta, además del código generado, características adicionales, tales como el tipo de la construcción. Existen ciertos aspectos de los lenguajes que están fuera de la representatividad que permiten las GIC. En el ámbito de los lenguajes de programación, la semántica recoge un conjunto de reglas que especifican el significado de sentencias sintácticamente válidas. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

7 Procesadores de Lenguaje
Introducción Ejemplo: int velocidad = espacio / tiempo; Su semántica identifica los siguientes aspectos: Se reserva memoria asociada al identificador velocidad. La memoria reservada deberá corresponder al tipo entero. Se calculará la velocidad como resultado de dividir el valor almacenado en la variable espacio entre el valor almacenado en la variable tiempo. Dicho resultado se asignará a la memoria reservada para velocidad. También se debe comprobar: El ámbito de los operadores. Que el operador ‘/’ se puede aplicar a los tipos de espacio y tiempo. Que el tipo del resultado de la operación coincide con el de velocidad. Etc. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

8 Procesadores de Lenguaje
Introducción La semántica de una sentencia de un lenguaje de programación está directamente relacionada con su estructura sintáctica y, por tanto, se suele representar mediante anotaciones de su árbol sintáctico. Una definición dirigida por la sintaxis especifica la traducción de una construcción en función de atributos asociados con sus componentes sintácticos. Un atributo puede representar, por ejemplo, un tipo, una cadena, una posición de memoria. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

9 Traducción dirigida por la sintaxis
Se asocia información a una construcción del lenguaje de programación proporcionando atributos a los símbolos de la GIC que representan la construcción. Los valores de los atributos se calculan mediante reglas semánticas asociadas a las producciones gramaticales. Dos notaciones para asociar reglas y producciones: Definiciones dirigidas por la sintaxis. Esquemas de traducción. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

10 Traducción dirigida por la sintaxis
Secuencia de acciones: Análisis sintáctico de los componentes léxicos de la cadena de entrada. Construcción del árbol de análisis sintáctico. Recorrido del árbol para evaluar las reglas semánticas en sus nodos. Como resultado, se obtiene la traducción de la cadena de componentes léxicos de la entrada. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

11 Traducción dirigida por la sintaxis
Las reglas semánticas permiten realizar acciones tales como: Generación de código. Almacenamiento de información en la tabla de símbolos. Emisión de mensajes de error. Comprobación de tipos. Otros. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

12 Definiciones dirigidas por la sintaxis
Las DDS son especificaciones de alto nivel para traducciones. Definición dirigida por la sintaxis. Utiliza una GIC para especificar la estructura sintáctica de la entrada. A cada símbolo de la gramática se le asocia un conjunto de atributos. A cada producción se le asocia un conjunto de reglas semánticas para calcular los valores de los atributos asociados con los símbolos que aparecen en esa producción. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

13 Definiciones dirigidas por la sintaxis
Una DDS es una generalización de una GIC en la que cada símbolo gramatical tiene un conjunto de atributos asociado, dividido en dos subconjuntos: sintetizados y heredados. Un atributo puede representar cualquier cosa: una cadena, un número, un tipo, una posición de memoria... El valor de un atributo sintetizado se calcula a partir de los valores de los hijos de dicho nodo en el AAS. El valor de un atributo heredado se calcula a partir de los valores de los hermanos y el padre de dicho nodo. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

14 Definiciones dirigidas por la sintaxis: Atributos y Reglas semánticas
Un atributo es una variable que representa una determinada propiedad del símbolo X. Los atributos se denotan con un nombre precedido por un punto y el nombre del símbolo al que está asociado. Reglas semánticas. Los valores que toman los atributos se establecen en función de un conjunto de reglas semánticas que están asociadas a cada una de las reglas sintácticas. Las reglas semánticas se definen en función de los atributos de los demás símbolos que componen la regla y otras posibles acciones. En las reglas también pueden incluirse otras acciones como cambiar de tipo, imprimir, etc... que se denominarán acciones semánticas. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

15 Definiciones dirigidas por la sintaxis
Traducción: transformación de una entrada en una salida. Se construye árbol de análisis sintáctico para la entrada. Cada nodo n está etiquetado con un símbolo gramatical X. X.a, valor del atributo a de X en ese nodo. Se calcula X.a en n con la regla semántica para el atributo a asociado con la producción de X utilizada en el nodo n. Árbol de análisis sintáctico con anotaciones, muestra los valores de los atributos en cada nodo. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

16 Definiciones dirigidas por la sintaxis
Forma de una DDS. Cada producción A ->  tiene asociado un conjunto de reglas semánticas de la forma b:= f(c1, .... , ck), donde f es una función y, o bien: b es una atributo sintetizado. de A, y c1, .... , ck son atributos de los símbolos gramaticales de la producción, o bien: b es un atributo heredado de uno de los símbolos del lado derecho y c1, .... , ck son atributos de los símbolos de la producción. En cualquier caso, b depende de los atributos c1, .... , ck. Una gramática con atributos es una DDS en la que las reglas semánticas no pueden tener efectos colaterales. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

17 Definiciones dirigidas por la sintaxis
Ejemplo: Traducción de notación infija a postfija. E  E1 op E2  E  E1 E2 op E  ( E1 )  E  E1 E  num  E  num La notación postfija no necesita paréntesis. Ejemplo: (9*5)+2 y 9-(5+2) Cada no terminal tiene asociado un atributo traducción con un valor que representa la notación postfija de la expresión generada por ese no terminal en un AAS. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

18 Definiciones dirigidas por la sintaxis
E  E + T  E.t := E1.t || T.t || ‘+’ E  E – T  E.t := E1.t || T.t || ‘-’ E  T  E.t := T.t T  num  T.t := num.v Atributo sintetizado t: traducción, lo poseen los no terminales T y E. Atributo sintetizado v: valor numérico devuelto por el analizador léxico, lo posee el terminal num. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

19 Definiciones dirigidas por la sintaxis: Atributos sintetizados
Se calculan a partir de los atributos de los nodos hijos del árbol. Muy utilizados en la práctica. Evaluación ascendente (LR). Ejemplo: Partiendo de la GIC del ejemplo anterior, crear una calculadora. S  E E  E + T E  E – T E  T T  num Evaluar la expresión 9 – print(E.val) E.val := E.val + T.val E.val := E.val – T.val E.val := T.val T.val := num.val © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

20 Definiciones dirigidas por la sintaxis: Atributos heredados
Se calculan mediante los atributos del padre o de los hermanos de dicho nodo. Sirven para expresar la dependencia de una construcción de un lenguaje de programación en el contexto en el que aparece. E.g.: Se pueden usar para comprobar si un identificador aparece en el lado izquierdo o derecho de una asignación, para decidir si se necesita la dirección o el valor del ident. Siempre es posible rescribir una DDS para que sólo use atributos sintetizados. Sin embargo, suele ser más natural utilizar atributos heredados. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

21 Definiciones dirigidas por la sintaxis
Ejemplo: Declaración de variables en C. D  T L T  int T  real L  L1 , id L  id L.her := T.tipo T.tipo := integer T.tipo := real L1.her := L.her inserta(id.lexema, L.tipo) inserta(id.lexema, L.tipo) © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

22 Definiciones dirigidas por la sintaxis
Evaluar: real a, b, c. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

23 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Si un atributo b, en un nodo del árbol, depende de un atributo c, entonces se debe evaluar la regla semántica para b después de la regla semántica que define c. Interdependencias entre atributos se pueden representar mediante grafo de dependencias. Antes de construir el grafo de dependencias, se escribe cada regla semántica en la forma b:= f(c1, .... , ck). Si es una llamada a un proc se crea un falso atrib sint b. El grafo tiene: Un nodo por cada atributo. Una arista al nodo de b desde el nodo de c si el atributo b depende del atributo c. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

24 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Algoritmo para construir el grafo de dependencias para un AAS. para cada nodo n en el AAS hacer para cada atributo a del símbolo en el nodo n hacer construir un nodo en el grafo de dependencias para a; para cada nodo n en el AAS hacer para cada regla semántica b := f(c1, c2,..., ck) asociada con la producción utilizada en n hacer para i:=1 hasta k hacer construir arista desde el nodo para ci hasta el nodo para b; © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

25 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Por ejemplo, supongamos que la siguiente es una regla semántica para la producción A  XY. A.a := f(X.x, Y.y) La regla define A.a como un atributo sintetizado que depende de los atributos X.x e Y.y. En el AAS, producirá tres nodos: A.a, X.x, Y.y. Habrá una arista desde X.x hacia A.a, y otra desde Y.y a A.a. Si la producción A  XY tiene asociada la regla semántica: X.i := g(A.a, Y.y) Habrá una arista desde A.a hacia X.i, y otra desde Y.y hacia A.a. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

26 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Ejemplo: Producción: E  E1 + E2 Regla semántica: E.val := E1.val + E2.val E.val se sintetiza a partir de E1.val y E2.val © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

27 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Ejemplo: Declaración de variables en C. Cada regla semántica insertar(id.entrada, L.her) conduce a la creación de un falso atributo. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

28 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Orden de evaluación. Ordenamiento topológico de un grafo dirigido acíclico: Ordenamiento n1, ..., nk de los nodos del grafo tal que las aristas vayan desde los nodos que aparecen primero en el ordenamiento a los que aparecen más tarde. Todo ord. topológico de un grafo de dependencias da un orden válido de evaluación de las reglas semánticas asociadas con los nodos de un árbol de análisis sintáctico. Este orden sólo sirve si si el grafo de dependencias no tiene ciclos. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

29 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Ejemplo: Ordenamiento topológico para el grafo de dependencias de la declaración de variables en C. a4 := real a5 := a4 inserta(id3.lex, a5) a7 := a5 inserta(id2.lex, a7) a9 := a7 inserta(id1.lex, a9) © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

30 Definiciones dirigidas por la sintaxis: Traducción
La traducción especificada por una DDS se puede precisar como sigue: Uso de la GIC para construir el AAS. Se construye el grafo de dependencias. A partir de un ordenamiento topológico del grafo de dependencias, se obtiene el orden de evaluación para las reglas semánticas. La evaluación de las reglas semánticas en dicho orden produce la traducción de la cadena de entrada. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

31 Definiciones dirigidas por la sintaxis: Árboles sintácticos
El uso de árboles sintácticos como representación intermedia permite separar la traducción del análisis sintáctico. Un árbol sintáctico es una forma condensada de un AAS, útil para representar construcciones de lenguajes. Ejemplo: S  if B then S1 else S2. En un árbol sintáctico, los operadores y palabras clave no aparecen como hojas, sino asociadas con el nodo interior que sería el padre en el AAS. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

32 Definiciones dirigidas por la sintaxis: Árboles sintácticos
En un árbol sintáctico, las cadenas de las producciones simples pueden estar rotas. S  E $ E  E + T | T T  T * F | F F  ( E ) | num La traducción dirigida por la sintaxis se puede basar también en árboles sintácticos, siguiendo el mismo enfoque que para los AAS. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

33 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente con atributos sintetizados Evaluación ascendente. Puede ser difícil construir un traductor para una def. dirigida por la sintaxis arbitraria. Existen subclases para las que es fácil construirlos. Una de ellas es la que incluye definiciones con atributos sintetizados. Los atributos sintetizados se pueden evaluar en un analizador ascendente conforme la entrada es analizada. El AS puede conservar en su pila los valores de los atributos sintetizados asociados con los símbolos gramaticales. Cuando se reduce, se calcula el valor del atributo sintetizado del lado izquierdo en función de los atributos de la parte derecha que aparecen en la pila. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

34 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente con atributos sintetizados Almacenamiento de los atributos en la pila. Se pueden utilizar campos adicionales en la pila, o bien usar una pila semántica, para almacenar los valores de los atributos sintetizados asociados a los símbolos gramaticales. En una regla semántica se hace referencia a los atributos situados en la pila semántica para acceder a los atributos sintetizados correspondientes. Si un símbolo no tiene atributo, su entrada de la pila está sin definir. Justo antes de reducir se sacan los atributos sintetizados de la parte derecha y se calcula el atributo sintetizado de la parte izquierda y se mete en la pila. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

35 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente con atributos sintetizados Ejemplo: A  X Y Z A.a := f(X.x, Y.y, Z.z) Reducción © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

36 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente con atributos sintetizados Ejemplo: Calculadora. Simular * 2 © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

37 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Definiciones con atributos por la izquierda Definiciones con atributos por la izquierda. Cuando la traducción tiene lugar durante el análisis sintáctico, el orden de evaluación de los atributos va unido al orden en el que se crean los nodos del árbol de análisis sintáctico. Orden de evaluación natural para muchos métodos de traducción descendente y ascendente: recorrido en profundidad. procedure visitaEnProfundidad (n: nodo) begin para cada hijo mi de n, de izq a dcha, hacer evaluar los atributos heredados de mi; visitaEnProfundidad(mi); evaluar los atributos sintetizados de n; end © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

38 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Definiciones con atributos por la izquierda Las definiciones con atributos por la izquierda son una clase de DDS cuyos atributos siempre se pueden evaluar en un orden de profundidad (generalmente, de izquierda a derecha). Las DAI incluyen todas las DDS basadas en gramáticas LL(1). Una DDS es una DAI si cada atributo heredado de Xj, 1 j  n, del lado derecho de A  X1 ... Xn, depende sólo de: Los atributos de los símbolos X1 ... Xj-1 a la izquierda de Xj en la producción. Los atributos heredados de A. Toda definición con atributos sintetizados es una definición con atributos por la izquierda. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

39 Definiciones dirigidas por la sintaxis: Esquemas de traducción
Esquema de traducción (ET): Es una GIC con las siguientes características: Atributos para los símbolos gramaticales. Acciones semánticas intercaladas en los lados derechos de las producciones. Las acciones se consideran como símbolos terminales. Equivalente a definición dirigida por la sintaxis con el orden de evaluación de las reglas semánticas explícito. La regla semántica se escribe entre llaves en la posición correspondiente. El árbol de AS de un ET indica una acción construyendo un hijo adicional. Este nodo no tiene hijos, de modo que la acción se realiza cuando se visita por primera vez el nodo. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

40 Definiciones dirigidas por la sintaxis: Esquemas de traducción
Cuando se diseña un ET, se deben respetar algunas limitaciones que garanticen que las acciones no hagan referencia a un atributo aún no calculado. Ejemplo más sencillo: sólo se usan atributos sintetizados. En este caso, se puede construir un ET creando una acción con una asignación para cada regla semántica, colocando dicha acción al final de la producción. La producción y la regla semántica: T  T1 * F T.val := T1.val * F.val dan como resultado la siguiente producción y acción semántica: T  T1 * F { T.val := T1.val * F.val } © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

41 Definiciones dirigidas por la sintaxis: Esquemas de traducción
Si hay atributos sintetizados y heredados entonces: Un atributo heredado para un símbolo en el lado derecho se debe calcular en una acción antes que dicho símbolo. Una acción no debe referirse a un atributo sintetizado de un símbolo que esté a la derecha de la acción. Un atributo sintetizado para el no terminal de la izquierda sólo se puede calcular después de que se hayan calculado todos los atributos a los que hace referencia. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

42 Definiciones dirigidas por la sintaxis: Esquemas de traducción
Ejemplo: Calculadora. S  E { print(E.val) } E  E + T { E.val := E.val + T.val } E  E – T { E.val := E.val – T.val } E  T {E.val := T.val } T  num {T.val := num.val } Evaluar la expresión 9 – © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

43 Definiciones dirigidas por la sintaxis: Esquemas de traducción
Ejemplo: Traductor de expresiones en notación infija a notación postfija. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

44 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente de atributos heredados Estudiaremos un método capaz de manejar las definiciones con atributos por la izquierda en análisis ascendente. Maneja todas las definiciones con atributos por la izquierda basadas en gramáticas LL(1). Puede implantar ciertas DAI basadas en gramáticas LR(1). El método se basa en la eliminación de los esquemas de traducción de acciones intercaladas. Se introduce una transformación que consigue que todas las acciones intercaladas en un ET ocurran en los extremos derechos de sus producciones. Se sustituye cada acción intercalada por un no terminal M y se asocia la acción al final de la producción M  λ. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

45 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente de atributos heredados Ejemplo: E  T R R  + T { print(‘+’) } R | λ T  num { print(num.valor) } Se transforma en: R  + T M R | λ M  λ { print(‘+’) } © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

46 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente de atributos heredados Herencia de atributos en la pila del AS. Un AS ascendente reduce el lado derecho de la producción AXY eliminando X e Y de la cima de la pila y sustituyéndolas por A. Un atributo sintetizado X.s se almacena en la pila semántica junto a X. Como el valor de X.s está en la pila del analizador antes de que tenga lugar cualquier reducción en el subárbol más abajo de Y, este valor puede ser heredado por Y. Si Y.h := X.s (regla de copia), entonces el valor de X.s se puede utilizar cuando se haga referencia a Y.h, ya que se sabe dónde está en la pila. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

47 Definiciones dirigidas por la sintaxis: Grafo de dependencias
Ejemplo: Declaración de variables en C. Cada regla semántica insertar(id.entrada, L.her) conduce a la creación de un falso atributo. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

48 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente de atributos heredados Ejemplo: Declaraciones en C. Se puede pasar el tipo de un identificador mediante reglas de copia usando atributos heredados. Se desea implantar el siguiente ET. D  T { L.tipo := T.tipo } L T  int { T.tipo := integer } T  real { T.tipo := real } L  { L1.tipo := L.tipo } L1 , id { inserta(id,id.lexema,L.tipo) } L  id { inserta(id, id.lexema, L.tipo) } © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

49 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente de atributos heredados Definición usando la pila en análisis ascendente. Producción Fragmento de Código D  T L T  int PilaSem[cima] := integer T  real PilaSem[cima] := real L  id inserta (id, pilaSem[cima], pilaSem[cima -1]) L  L1, id inserta (id, pilaSem[cima], pilaSem[cima -3]) © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

50 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente de atributos heredados Sustitución de atributos heredados por sintetizados. En ocasiones, se puede evitar usar atributos heredados cambiando la GIC subyacente. Ejemplo D  L : T T  integer | char L  L1 , id | id L1 debería heredar un tipo T que está a su derecha  No es una DAI  No se puede realizar la traducción durante el análisis sintáctico. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

51 Procesadores de Lenguaje
Definiciones dirigidas por la sintaxis: Evaluación ascendente de atributos heredados Solución: D  id L T  , id L | : T L  integer | char © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

52 Definiciones dirigidas por la sintaxis
Ejercicio. Construir una GIC que reconozca el siguiente lenguaje: Programa delimitado por program nombre ... end. Dentro del programa, lista de sentencias con al menos una sentencia. Una sentencia puede ser una asignación, una selección condicional, un bucle for o un bloque con cero o más sentencias. Expresiones aritméticas en notación infija que permiten realizar sumas y multiplicaciones, y agrupar con paréntesis. Las expresiones condicionales permiten comparar en igualdad o desigualdad entre dos expresiones aritméticas. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

53 Definiciones dirigidas por la sintaxis
Añadir a la GIC las acciones semánticas correspondientes para traducir una entrada al siguiente lenguaje: Asignación: mover id1, pila. Expresiones: notación postfija. El resultado de una expresión queda en la cima de la pila. Condiciones: Si falso saltar a etiqueta. Saltar a etiqueta. Etiqueta nombreEtiqueta. Ejemplo: a := 2 + 3;  mover a, pila © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

54 Procesadores de Lenguaje
Comprobación de tipos Un compilador debe comprobar que el programa fuente siga las convenciones sintácticas y las semánticas (comprobación estática). Ejemplos de comprobación estática: Comprobaciones de tipos: operandos incompatibles en operaciones aritméticas, asignación, etc. Comprobaciones de flujo de control: break en C. Comprobaciones de unicidad: identificadores en un mismo ámbito, etiquetas en una proposición case, etc. Comprobaciones relacionadas con nombres: nombre de procedimiento en ADA debe coincidir con end nombre;. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

55 Procesadores de Lenguaje
Comprobación de tipos Un comprobador de tipos asegura que el tipo de una construcción coincida con el previsto en su contexto. El tipo de una construcción de un lenguaje se denotará mediante una expresión de tipo: Un tipo básico es una expresión de tipo (boolean, char, integer, real, etc.). Un constructor de tipos aplicado a expresiones de tipos es una expresión de tipo. Sea T una expresión de tipos, los constructores de tipos incluyen: Matrices: array(I, T), donde I es un conjunto de índices. Registros: T1xT2. Punteros: pointer(T). Funciones: T1xT2  T3. © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

56 Comprobación de tipos: Sistemas de tipos
Un sistema de tipos está compuesto por una serie de reglas para asignar expresiones de tipos a las distintas partes de un programa. Un comprobador de tipos implanta un sistema de tipos. Los sistemas de tipos se especifican de forma dirigida por la sintaxis. Un sistema de tipos seguro elimina la necesidad de comprobar dinámicamente errores de tipos. En la práctica, algunas comprobaciones sólo se pueden realizar dinámicamente (i.e.: índice que recorre un array). © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

57 Comprobación de tipos: Comprobador sencillo
Ejemplo: Gramática que genera una secuencia de declaraciones seguida de una expresión aritmética. P  D ; E D  D ; D | id : T T  char | integer | array [ num ] of T E  E + E | E * E | car | num | id | E [ E ] El objetivo del analizador es obtener el tipo de la expresión. Si se produce un error, se deberá devolver el valor error_tipo. Para simplificar, se supone que todas las matrices tienen un rango desde 1 hasta num. Por ejemplo, array [256] of char conduce a la expresión de tipo array(1..256, char). © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje

58 Comprobación de tipos: Comprobador sencillo
P  D ; E D  D ; D D  id : T {añadeTipo(id.lex, T.tipo)} T  char {T.tipo := char} T  integer {T.tipo := integer} T  array [ num ] of T1 {T.tipo := array(num.val, T1.tipo)} E  car {E.tipo := char} E  num {E.tipo := integer} E  id {E.tipo := buscaTipo(id.lex)} E  E + E {E.tipo := if E1.tipo = integer and E2.tipo = integer then integer else error_tipo} E  E * E {E.tipo := if E1.tipo = integer and E  E [ E ] {E.tipo := if E2.tipo = integer and E1.tipo = array(s,t) then integer t else error_tipo} © 2002 / 03 - Francisco Carrero Procesadores de Lenguaje


Descargar ppt "Procesadores de Lenguaje"

Presentaciones similares


Anuncios Google