APUNTES COMPILADORES II.pdf

download APUNTES COMPILADORES II.pdf

of 66

Transcript of APUNTES COMPILADORES II.pdf

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    1/66

    APUNTES PARA COMPILADORES II

    UN ENFOQUE PRCTICO EN ELPROCESO DE ANLISIS Y SNTESIS

    EN LA CONSTRUCCIN DE

    COMPILADORES

    Preparado por: Prof. Julio Surez

    UCSA

    Ao 2.007

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    2/66

    ndi ce de Conteni do

    Captu lo 1 PginaGramticas con atributos 11.2 Tcnicas de Traduccin segn las acciones semnticas: 31.3 Tipos de atributos 31.4 Evaluacin ascendente de definiciones con atributos sintetizados 5

    1.5 Evaluacin ascendente de atributos heredados 5Ejercicios del Captulo 6

    Captu lo 22.1 ANLISIS SEMANTICO 82.2 Comprobacin de Tipos 82.3 Sistema de Tipos 92.4 Expresiones de Tipos 92.5 Comprobacin Esttica y Dinmica de Tipos 102.6 Diseo de un Comprobador de Tipos para una Gramtica sencilla 102.6.1 Implementacin de un sistema de tipos: reglas de declaraciones 102.6.2 Comprobacin de Tipos para las Expresiones 112.6.3 Comprobacin de Tipos en las Proposiciones 11

    2.6.4 Comprobacin de tipos en las funciones 112.7 Equivalencia de Tipos 112.8 Conversiones de Tipos 112.9 Sobrecarga de funciones y operadores 122.10 Funciones Polimrficas 122.11 Variables de tipos 132.12 La Tabla de Smbolos 14Ejercicios del Captulo 16Anexo1 18Anexo2 23

    Captu lo 3Ambientes para el momento de la ejecucin 253.1Aspectos del lenguaje fuente 253.2 Arboles de activacin 253.3 Pilas de Control 263.4 El mbito de una declaracin 273.5 Enlace de nombres 273.6 organizacin de la memoria 283.6.1 Subdivisin de la memoria durante la ejecucin 283.6.2 Registros de activacin 293.6.3 Disposicin Espacial de los datos locales en el momento de la compilacin 303.7estrategias para la asignacion de memoria 303.7.1 Asignacin esttica 303.7.2 Asignacin por medio de una pila 313.7.3 Asignacin por medio de un montculo 323.8 Paso de parmetros 33

    3.8.1 Llamada por valor 333.8.2 Llamada por Referencia 34

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    3/66

    3.8.3 Copia y Restauracin 35Ejercicios del Captulo 36

    Captu lo 44.1 Generacin de cdigo intermedio 394.2 Lenguajes intermedios 394.3 Cdigo de tercetos para expresiones 434.4 Generacin de cdigo de Tercetos en Sentencias de Control 45

    4.4.1 Sentencia IF 454.4.2 Sentencia WHILE 474.4.3 Sentencia REPEAT 484.4.4 Sentencia CASE 50Ejercicios del Captulo 55Anexo1 del Captulo 57Anexo2 del Captulo 62

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    4/66

    Captulo 1

    GRAMATICAS CON ATRIBUTOS

    Adems de comprobar que un programa cumple con las reglas de la gramtica, hay quecomprobar que lo que se quiere hacer tiene sentido. El anlisis semntico dota de unsignificado

    coherente a lo que hemos hecho en el anlisis sintctico. El chequeo semntico seencarga de que los tipos estn correctos, por ejemplo no podemos multiplicar unacadena de caracteres por un entero.Veamos un ejemplo para tener una visin global de este tema. Supongamos quequeremos hacer una pequea calculadora que realiza las operaciones + y * . Lagramtica ser la siguiente:

    EE +T| T

    TT * F| F

    F ( E )| NUM

    ( ejemplo 1)Queremos calcular: 33 + 12 + 20 Ej1.Los pasos que seguiremos sern:1. El analizador Lxico devolver la siguiente cadena como una secuencia de tokens33 + 12 + 20 => NUM + NUM + NUM

    2. El anlisis Sintctico ascendente construir el siguiente rbol de anlisis sintctico

    (ejemplo 2)Para calcular el valor real de la sentencia, necesitamos que el scanner, que analiza lascadenas de la entrada, retorne no solamente el token correspondiente, deseamostambin, los valores de estos lexemas, pero como valor numrico

    La pregunta, es ahora donde guardar estos nmero mientras se construye el rbol deanlisis sintctico?

    1

    2

    3

    4

    5

    6

    7

    8

    9

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    5/66

    En la pila de anlisis. En estase guardan estados, smbolos y valores, de esta forma elproceso es el siguiente:

    (ejemplo 3)Los ATRIBUTOS son campos o propiedades asociados, a smbolos de la

    gramtica, terminales o no terminales, donde se almacenan diferentes datos necesariospara realizar fases de la traduccin dirigida por la sintaxis.

    Cada registro o nodo de la pila correspondiente a los smbolos gramaticalescontendr entonces, el nombre del smbolo y los atributos diseados para laprogramacin de la traduccin.

    Recordemos que la programacin de esta traduccin, permitir realizar tareas de:

    Anlisis semntico. Traduccin de interpretacin del programa fuente (ejecucin del mismo, luego

    de la etapa de anlisis). Generacin de cdigo intermedio.

    Completa:Las fases de compilacin en la etapa de anlisis:

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    6/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    7/66

    Si se considera un nodo de un smbolo gramatical de un rbol de anlisis sintcticocomo un registro con campos para guardar informacin, entonces un atributocorresponde al nombre de un campo.

    Un atributo puede representar cualquier cosa: una cadena, un nmero, un tipo, unaposicin de memoria, etc. El valor de un atributo en un nodo de un rbol de anlisissintctico se define mediante una regla semntica asociada a la regla de produccinutilizada en dicho nodo.

    Atributos sintetizados: aquellos que se calculan, en dependencia a los atributos de losnodos hijos de dicho nodo, en el rbol de anlisis sintctico. Estos atributos son propiosde un anlisis ascedente.

    Atributos heredados: se calculan a partir de los valores de los atributos en los nodoshermanos y el nodo padre de dicho nodo, en el rbol de anlisis sintctico. Estosatributos son propios de un anlisis descendente.

    Ejemplos:

    Atributos sintetizados:

    S a R supongamos que tanto el terminal a, como los no terminales Ry S,tienen atributos sintetizados llamados valor. El calculo del atributo valor de S, dependede los valores de los atributos de a y R, graficados de la siguiente forma:

    La accin semntica para calcular S.valor, podra ser : S.valor= a.valor + R.valor

    Atributo heredado:

    D int L Supngamos que los smbolos L e id tengan atributos heredadosL id llamados her, que se calculan por copia, el rbol de anlisissintctico sera:

    (Ejemplo 4)

    S.valor

    a.valor R.valor

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    8/66

    1.4 Evaluacin ascendente de definiciones con atributos sintetizados

    Los atributos sintetizados se pueden evaluar con un analizador sintctico ascendenteconforme la entrada es analizada.

    Es el caso ms simple.

    El analizador sintctico puede conservar en su pila los valores de los atributossintetizados asociados con los smbolos gramaticales. Siempre que se haga unareduccin, se calculan los valores de los nuevos atributos sintetizados a partir de losatributos que aparecen en la pila para los smbolos gramaticales del lado derecho de laproduccin con la que se reduce.

    1.5 Evaluacin ascendente de atributos heredados

    Un analizador sintctico ascendente reduce el lado derecho de la produccin A X Yeliminando X e Y del tope de la pila y sustituyndolas por A. Supngase que X tiene unatributos sintetizado s, X.s. Como el valor de X.s ya est en la pila del analizador antes

    de que tenga lugar cualquier reduccin en el subrbol ms debajo de Y, este valor puedeser heredado por Y. Es decir, si el atributo heredado Y.h est definido por la regla decopia Y.h = X.s, entonces el valor de X.s se puede utilizar donde se llama a Y.h.

    Las reglas de copia desempean un importante papel en la evaluacin de atributosheredados durante el anlisis sintctico ascendente.

    En realidad, la mejor tcnica para tratar con atributos heredados en el anlisis sintcticoLR es utilizar estructuras de datos externas, tal como la tabla de smbolos ( para losidentificadores y constantes) o variables no locales, con el fin de mantener los valoresde atributos heredados.

    D.sin

    int.sin L.her

    id.her

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    9/66

    Regla : A X.s Y.h

    Pila rbol Accin Semntica

    Y.h

    A X {Y.h= X.s} YX.s

    Anlisis ascendente

    (ejemplo 5)G(D) una gramtica para declaraciones de identificadores, con transmisin deltipo de datos a los nodos hijos.

    D T { auxi = T.tipo } LT int { T.tipo = entero }T float { T.tipo = real}

    L L , id { id.tipoh = auxi }L id { id.tipoh = auxi }

    (Ejemplo 6)

    En este ejemplo, auxi es una estructura externa.tipo: es un atributo sintetizado de T, que se calcula al reducir int o float por T.tipoh: es un atributo heredado de id, que se calcula en el anlisis ascendente, medianteuna copia de la estructura externa. Conceptualmente, debera haber sido desde su nodopadre ( L ), pero como ste, an no se encuentra en la pila, la copia no se podr efectuardesde algn atributo de este smbolo.

    Ejercicios

    1) La siguiente gramtica genera expresiones formadas mediante la aplicacin de unoperador aritmtico + a constantes enteras y reales. Cuando se suman enteros, el tipoobtenido es entero, de lo contrario es real.G(E)E E + T | TT numr | num

    a) Escribe una DDS para determinar el tipo de cada expresin,b) Ampliar la DDS anterior para traducir a expresiones de notacin postfija as

    como determinar los tipos. Utilizar el operador unitario ENTAREAL, paraconvertir un valor entero a real equivalente, de manera que ambos operandos dela suma, en la forma postfija, tengan el mismo tipo.

    2) Escribe cdigo yacc/lex para ejecutar las tareas a) y b), por separado, del ejercicioanterior.

    3) Escribe una gramtica con atributos que permita la carga de valores enteros, reales yde tipo carcter.

    Y.h

    A

    X.sCmo Y an no se encuentra en la pila, y parapermitir utilizar Y.h, luego que Y se hayadesapilado, se puede utilizar una estructuraexterna a la pila, que almacene el valorcalculado a partir del atributo de X.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    10/66

    4) Con la gramtica atribuida del ejemplo 6, construye el rbol de anlisis sintctico dela sentencia: int alto, bajo , y verifica el estado de la pila y el resultado de lasacciones semnticas, en cada paso del reconocimiento de esta sentencia.

    CAPITULO 2

    ANLISIS SEMNTICO

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    11/66

    Captulo 2

    2.1 ANLISIS SEMANTICO

    Un compilador realiza comprobaciones sintcticas y semnticas. Esta comprobacin

    llamada comprobacin esttica (para distintiguirla de la dinmica que se realiza durantela ejecucin del programa objeto), garantiza la deteccin y comunicacin de ciertostipos de errores.

    Los ejemplos de comprobacin esttica incluyen:1) comprobaciones de tipos. Un compilador debe informar de un error si se aplica un

    operador a un operando incompatible.2) Comprobaciones de flujo de control. Las proposiciones que hacen que el flujo de

    control abandone una construccin deben tener algn lugar a dnde transferir elflujo de control.

    3) Comprobaciones de unicidad. Hay situaciones en que se debe definir un objeto unavez exactamente. Como en el caso de los identificadores, las etiquetas de los case.

    4) Comprobaciones relacionadas con nombres. En ocasiones, el mismo nombre debe

    aparecer dos o ms veces. Por ejemplo el nombre de un bloque de programa, enalgunos lenguajes como el ADA, este nombre debe aparecer al principio y al finaldel bloque. El compilador debe comprobar que se utilice el mismo nombre en ambossitios.

    2.2 Comprobacin de Tipos

    Se trata especialmente la Comprobacin de tipos, la mayora de las otrascomprobaciones estticas son rutinarias, algunas de ellas pueden formar parte de otrasactividades. Por ejemplo, Conforme se introduce informacin acerca de un nombre enuna tabla de smbolos, se puede comprobar que el nombre est declarado de una nicamanera.

    Un comprobador de tipos se asegura que el tipo de una construccin coincida con elprevisto en su contexto. Por ejemplo, el operador aritmtico mod ( de Pascal) exigeoperandos de tipo entero, de modo que un comprobador de tipos, debe asegurarse deque los operandos de mod tengan tipo entero.

    Ubicacin de un comprobador de tipos

    Cadena de rbol rbolComponentes Analizador ---------------- Comprobador ------------- Generador deLxicos Sintctico sintctico de tipos sintctico CdigoIntermedio

    Puede necesitarse la informacin sobre los tipos reunida por un comprobador de tipos

    cuando se genera el cdigo. Por ejemplo, los operadores aritmticos como +normalmente se aplican a enteros como reales, tal vez a otros tipos, y se debe examinar

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    12/66

    el contexto de + para determinar el sentido que se pretende dar. Se dice que un smboloque puede representar diferentes operaciones en diferentes contextos estsobrecargado. La sobrecarga puede ir acompaada de coercin de tipos, donde uncompilador proporciona un operador para convertir un operando en el tipo esperado porel contexto.Una nocin diferente de la sobrecarga es la de polimorfismo. El cuerpo de unafuncin polimrfica puede ejecutarse con argumentos de varios tipos.

    2.3 Sistema de Tipos

    El diseo de un Comprobador de Tipos para un lenguaje se basa en informacinacerca de las construcciones sintcticas del lenguaje, la nocin de tipos y las reglas paraasignar tipos a las construcciones de lenguaje.Un Sistema de Tipos es una serie de reglas para asignar expresiones de tipos a lasdistintas partes de un programa. Un comprobador de tipos implanta un sistema detipos.

    2.4 Expresiones de TiposSon notaciones utilizadas para definir un tipo o una construccin de tipos para unlenguaje. Esto quiere decir que una expresin de tipo, es un tipo bsico (int, char,boolean, real, etc) o un operador llamado constructor de tipos que permiten definirotros tipos diferentes a los bsicos.Debe considerarse por regla, que una expresin de tipo es:

    a) un tipo bsico. A ms de los ya mencionados, se puede considerar un tipo bsicoerror_tipoque indicar un error durante la comprobacin. Y un tipo bsico vacio,que indicara la ausencia de tipo, para permitir la comprobacin de proposiciones.

    b) Una expresin de tipo puede recibir un nombre ( caso de los registros / tuplas,cuyos componentes tienen nombres, los campos). Estos nombres tambinconstituyen expresiones de tipos.

    c) Un constructor de tipo, aplicado a otras expresiones de tipo :

    c.1) Matrices : Si T es un exp. Tipo que indica tipo de los elementos de la matriz, elconstructor ser array(I,T) donde I indica el tamao del arreglo. Ej.Array(1..10,integer) indica un arreglo de 10 enteros.

    c.2) Productos : Si T1 y T2 son expresiones de tipo, entonces su productocartesiano T1 X T2 es una expresin de tipo.Ej . T1: integer T2: float. T1 X T2 integer X float struct lista {n int; mfloat;};

    c.3) Registros : similar al anterior. La diferencia entre un registro y un producto esque los campos de un registro tienen nombres.El constructor de un tipo record se

    aplicar a una tupla formada con nombres de campos y tipos de campos.Ej. Record (( valor X integer) X ( nombre X array(1..15, char)))

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    13/66

    c.4) Apuntadores : si T es una exp. Tipo, entonces pointer(T) es una exp. De tipoque indica el tipo apuntador a un objeto de tipo T. Ej. int * a; define unapuntador a una expresin de tipo bsico entero. Pointer(entero) sera la expresinde tipo.

    c.5)Funciones : una funcin transforma elementos de un conjunto Dominio a otroconjunto Rango. La exp. Tipo sera DR. Por ej. una funcin que recibe dos

    enteros y devuelve un dato tipo boolean. Su exp. Tipo ser : entero X entero boolean

    La mayora de los lenguajes solo devuelven exp. de tipos bsicos, aunque existen excepciones.

    Suponen estas excepciones, como el caso del lenguaje LISP, que se permite devolver objetosarbitrarios.Eje. del libro : una funcin que recibe como parmetro una funcin que recibe entero yretorna entero, y que devuelva una funcin del mismo tipo que su entrada. Su exp. De tipo sera :

    (entero entero) (entero entero)

    d) Una expresin de tipo, puede contener variables cuyos valores son expresiones detipos. Ej. B= pointer(A) donde A es otra variable de tipo de una exp. De tipodesconocido.

    2.5 Comprobacin Esttica y Dinmica de Tipos

    Se dice que la comprobacin realizada por un compilador es esttica ( comprobacinrealizada en tiempo de compilacin), mientras que la comprobacin dinmica se realizaen el momento de ejecucin del programa objeto. En principio la comprobacin de tipospuede realizarse tambin dinmicamente, si el cdigo objeto carga el tipo de unelemento con su valor. Aunque, la comprobacin esttica es importante para elmomento de asignacin de memoria como se ver ms adelante

    Un sistema de tipos seguro elimina la necesidad de comprobar dinmicamente erroresde tipos ya que permite determinar estticamente que dichos errores no puedan ocurrircuando se est ejecutando el cdigo objeto.Se dice que un lenguaje es fuertemente tipificado si su compilador puede garantizar que

    los programas que acepte se ejecutarn sin errores de tipo.

    2.6 Diseo de un Comprobador de Tipos para una Gramtica sencilla

    Obsrvese como se disea la gramtica para tipos bsicos y estructuras como punteros yarreglos, en la gramtica de la fig. 6.3 pg 361P D; ED D;D | id : TT char | integer | array [num]of T | T *E literal | num | id | E mod E | E [E] | E | E *

    El no Terminal P consta de declaraciones D seguida de una expresin simple E

    A continuacin su correspondiente esquema de traduccin, que indica que la tcnicapropuesta para la comprobacin de tipos se basa en la traduccin dirigida por sintaxis.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    14/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    15/66

    2.7 Equivalencia de Tipos

    Por identificador : para tipos simples ej. int a; int b; se dice que a y b son equivalentes

    Por estructura : para tipos estructuras como por ejemplo los registros . Ej.,record1((valor X entero) X (nombre X array(10,char))) y record2((valor X entero) X(nombre X array(10,char))), se dice que record1 y record2 son equivalentes

    2.8 Conversiones de TiposEjemplo del libro :

    x +y , x real y entero. Como la representacin enteros y reales son diferentes en elprocesador y se utilizan instrucciones de mquina distintas, puede que el compiladortenga que convertir primero uno de los operandos de la suma.Coerciones

    Se dice que la conversin de tipo a otro es implcita si el compilador la va a realizarautomticamente. Las conversiones de tipo implcitas, tambin llamadas coerciones selimitan en muchos lenguajes a situaciones donde en principio no se pierde ningunainformacin; por ejemplo un entero se convierte a real pero no al contrario.Se dice que la conversin es explicita si el programador debe escribir algo para motivarla conversin. Para un comprobador de tipos, las conversiones explicitas parecen

    iguales que las aplicaciones de funcin, as que no presentan problemas nuevos.

    Reglas de comprobacin de tipos con esquema de traduccin, para la coercin de enteroa real (ejemplo de libro)E num {E.tipo = integer}E num . num {E.tipo = real}E id {E.tipo = busca(id.entrada)}E E1 op E2 {E.tipo = if E1.tipo = integer and E2.tipo = integer then integer

    else if E1.tipo = integer and E2.tipo = real then realelse if E1.tipo = real and E2.tipo = integer then realelse if E1.tipo = real and E2.tipo = real then realelse error_tipo }

    2.9 Sobrecarga de funciones y operadores

    Un smbolo sobrecargado es el que tiene distintos significados dependiendo de sucontexto. Caso del operador + que puede representar suma de enteros o de reales , oconcatenacin de cadenas.Es tarea del analizador semntico, determinar el sentido del operador, para lascomparaciones estticas.La sobrecarga se resuelve cuando se define un significado nico para un caso de unsmbolo sobrecargado. En muchos lenguajes los operadores aritmticos se encuentransobrecargados, entonces se define su significado nico de acuerdo a los argumentos deloperador, es decir a los tipos de los argumentos.

    Caso de funciones

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    16/66

    No siempre es posible resolver la sobrecarga observando nicamente los argumentos deuna funcin. Porque en lugar de un solo tipo una subexpersin dentro de la funcinpuede tener varios tipos (Como en el caso en que una funcin recibe como argumentootra funcin con varios tipos diferentes).La solucin es la reduccin de los tipos de las subexpresiones, es decir determinar unsolo tipo para cada argumento de la funcin, por ms que estos sean complejos.

    Ejemplo desarrollado en clase

    2.10 Funciones Polimrficas

    Las proposiciones del cuerpo de una funcin polimrfica puede ejecutarse conargumentos de distintos tipos.El trmino polimrfico tambin se aplica a cualquier parte de cdigo que puedaejecutarse con argumentos de tipos distintos, de modo que se puede hablar de funcin,as como de operadores polimrficos.Los operadores predefinidos para indicar matrices, aplicar funciones y manipularapuntadores son generalmente polimrficos, porque no se limitan a una determinadaclase de matriz, funcin o apuntador.Las funciones polimrficas resultan atractivas porque facilitan la implantacin de

    algoritmos que manipulan estructuras de datos, independientemente de los tipos de loselementos en la estructura de datos. Por ejemplo es conveniente tener un programa quedetermine la longitud de una lista sin que sea necesario conocer los tipos de loselementos de la lista.

    Ejemplos desarrollados en clase

    2.11 Variables de tipos

    Las variables que representan expresiones de tipos permiten considerar tiposdesconocidos.Una aplicacin importante de las variables de tipo es la comprobacin del usoconsistente de identificadores en un lenguaje que exija que los identificadores sedeclaren antes de ser utilizados. Una variable representa el tipo de un identificador no

    declarado. Por ejemplo, observando el programa se puede saber si el identificador nodeclarado se utiliza como un entero en una proposicin y como una matriz en otra.Dicho uso inconsistente pude considerarse como un error. Por otra parte, si la variablesiempre se utiliza como entero, entonces no slo se ha garantizado un uso consistente; apartir del proceso se ha llegado a la conclusin de cul debe ser su tipo.

    La inferencia de tipos es el problema de determinar el tipo de una construccin delenguaje a partir del modo en que se usa. Este trmino se aplica a menudo al problemade inferir el tipo de una funcin a partir de su cuerpo.EjemploFunction desref(p);begin

    return p

    end;

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    17/66

    No se sabe el tipo de p, entonces se representa por El postfijo indica el retorno deun valor a partir de una direccin ( o apuntador)de dicho valor. Como se aplica a p enla expresin p, lgicamente p debe ser un apuntador a un objeto de tipo desconocido, as que= pointer()donde es una variable de tipo. La expresin p tiene tipo , de modo que se puedeescribir la expresin de tipo para cualquier, pointer().

    Las expresiones polimrficas se puede expresar :.pointer() para el caso anterior.Para una funcin polimorfica que calcule la longitud de cualquier tipo de lista :. Lista()integersi la lista tuviera enteros serialista(integer) integersi la lista tuviera caractereslista(lista(char))integer

    2.12 La Tabla de Smbolos

    La tabla de smbolos es el principal atributo heredado en un compilador y, despus delrbol de anlisis sintctico, tambin forma la principal estructura de datos.

    Las principales operaciones de la tabla de smbolos son la insercin, bsqueda yeliminacin; pero tambin pueden ser necesarias otras operaciones. La operacin deinsercin se utiliza para almacenar la informacin proporcionada por las declaracionesde nombres ( identificadores ), cuando se analizan estas declaraciones. La operacin debsqueda es necesaria para recuperar la informacin asociada con un nombre cuandoste se utiliza en el cdigo asociado. La operacin de eliminacin es necesaria paraeliminar la informacin proporcionada por una declaracin cuando sta ya no se aplica.Las propiedades de estas operaciones son dictadas, o reguladas por las reglas del

    lenguaje de programacin que se est traduciendo. En particular, la informacin que senecesita almacenar en la tabla de smbolos est en funcin de la estructura y propsitode las declaraciones. Esto por lo regular incluye informacin de tipo de datos,informacin sobre la regin de aplicabilidad (mbito) e informacin acerca de laubicacin posible en la memoria ( para el momento de la generacin de cdigo), entreotros valores.

    Permanece slo en tiempo de compilacin, no de ejecucin, excepto en aquellos casosen que se compila con opciones de depuracin.

    La Estructura de la tabla de smbolos

    La tabla de smbolos en un compilador es una tpica estructura de datos de diccionario.La eficiencia de las tres operaciones mencionadas, vara de acuerdo con la organizacinde la estructura de datos.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    18/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    19/66

    asociadas a cada identificador en la tabla de smbolos, al igual que el generador decdigo.

    El optimizador de cdigo no necesita hacer uso de ella

    Ejercicios PrcticosTrabajo en Grupo : COMPROBACIONES DE TIPOS Y ANALISISSEMANTICO

    1) Algunos lenguajes, como PL/I, coercionan un valor booleano a un entero, conTRUE identificado con 1 y FALSE con 0. Por ej. 5

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    20/66

    Define atributos, en cdigo YACC, para los smbolos id y E, de manera que sepuedan almacenar : tipos de datos y valores de estos.

    4) Dada la Gramtica G(P)P D;ED D; D | id : TT lista of T | char | integerE ( L ) | literal | num | id | nil (nil indica vacio)L E, L | E

    Escribe las accciones semnticas para determinar los tipos de las expresiones (E)y las listas ( L ).

    5) De la comprobacin en Expresiones dado, modifica las acciones semnticaspara que impriman un mensaje descriptivo cuando se detecte un error y paraque contine la comprobacin como si hubiera aparecido el tipo previsto.

    6) Modifica el esquema de traduccin para la comprobacin de proposicionesdado, para que sirva para:

    a) Proposiciones que tengan valores. El valor de una asignacin es elvalor de la expresin a la derecha de =. El valor de una proposicincondicional o una proposicin while es el valor del cuerpo de laproposicin; el valor de una lista de proposiciones es el valor de laltima proposicin de la lista.

    b) Expresiones booleanas. Aade producciones para los operadores

    lgicos AND, OR y NOT, y para operadores de comparacin (

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    21/66

    Analizar y elaborar conclusiones sobre los mtodos de comprobacin de tipos en :las expresiones, las proposiciones, y de las funciones.

    Grupo 23 Equivalencia de expresiones de tipos Lean y elaboren conclusiones sobre la equivalencia de tipos, en la fase de

    comprobacin de tipos, mediante los mtodos de equivalencia por nombre yequivalencia por estructura. Escriban ejemplos de cada mtodo.

    (No es necesario que se lea sobre Ciclos en las representaciones de tipos)

    4 Conversiones de tipos Qu son las conversiones de tipos? Qu implica una operacin de coercin?. Ejemplo Cundo una coercin es explcita?. ejemplo

    5 Sobrecarga de Funciones y Operadores Qu es un smbolo sobrecargado? Ejemplo De qu manera se resuelve la sobrecarga de smbolos ejemplo en funcin al

    ejemplo anterior Expliquen, con sus palabras, que implica una reduccin de conjuntos de tipos

    posibles. Analicen el ejemplo presentado en la fig. 6.12

    6 Funciones Polimrficas Qu es una funcin polimrfica? Den ejemplos mediante declaraciones de variables

    de alguna funcin u operador con esta caracterstica polimrfica. A qu se refiere el concepto de variables de tipo?. Cul es su principal aplicacin? Qu es la inferencia de tipos?

    ANEXO1 Del CaptuloUn comprobador de tipo, para expresiones con tabla de smbolos para losidentificadores. Se incluye la interpretacin de una de las operaciones aritmticas. Eltrabajo en clase consistir en completar la traduccin de las dems operaciones, yagregarle otras expresiones.

    /* COMPROBADOR DE TIPOS: COMTI6Y.Y *//* fecha 01/08/2005. */%{#include#include/* Prototipos de Funciones para manejo de tabla de Simbolos */

    void agrega(char[]);void agregatipo(char[],int);

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    22/66

    int busca(char[]);void cargavalor(int, char[]);long buscavalor1(char[]);float buscavalor2(char[]);void muestrapila(void);

    /* Estructura de Tabla de Simbolos*/typedef struct tds{

    char nombre[20];int tipo; /* sera 1: int, 2: real 3:char*/long valore;float valorr;struct tds * sig;}TDS;

    /* Variables auxiliares */TDS *nuevo;TDS *primero=NULL;TDS *ultimo=NULL;int retortipo;long valoren;

    float valorre;%}

    %union {struct{

    long entvale; /* valor tomado por el token NUMBER */float realvale; /* valor tomado por el token NUMREAL */int tipoe;

    }expre;struct{long vblno;float vblreal;char nome[20]; /* nombre de la variable */char tipon[30];

    }nam;

    long entval;float realval;char tipo[30];

    }

    %type expression%type t%token NAME /* si tenemos un nombre de variable regresamos su indice */%token NUMBER /* si tenemos un numero regresamos su valor */%token NUMREAL%token QUIT /* token de salida de la calculadora */

    %token INT%token REAL

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    23/66

    %token CHAR%token ARRAY DE%left '-' '+'%left '*' '/'

    %%lista_sentencia: sentencia '\n'

    | lista_sentencia sentencia '\n'

    ;

    sentencia: NAME '=' expression {switch($3.tipoe){case 1:

    valoren= $3.entvale;cargavalor(1,$1.nome);break;

    case 2:valorre=$3.realvale;cargavalor(2,$1.nome);

    break;

    }}| NAME ':' t {agrega($1.nome);

    if(strcmp($3,"int")==0)agregatipo($1.nome,1);

    if(strcmp($3,"real")==0)agregatipo($1.nome,2);

    if(strcmp($3,"char")==0)agregatipo($1.nome,3);}

    | expression {printf("%.2f\n", $1.entvale);}|;

    t : INT {strcpy($$,$1);}| REAL {strcpy($$,$1);}| CHAR {strcpy($$,$1);}| '*' t {strcpy($$,"pointer a");/* cargar a la TDS t.tipo*/ }| ARRAY '[' NUMBER ']' DE t {strcpy($$,"array");}/* cargar a la TDS NUMBER.val

    y t.tipo*/;

    expression : expression '+' expression {if($1.tipoe==1 && $3.tipoe==1){$$.entvale = $1.entvale + $3.entvale;

    printf("\n Valor de la suma %ld", $$.entvale);}

    else{if($1.tipoe==2 && $3.tipoe==2){

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    24/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    25/66

    {primero=nuevo;ultimo=nuevo;}

    else{ultimo->sig=nuevo;ultimo=nuevo;

    }muestrapila();}

    void agregatipo(char id[],int codi){TDS * auxi;auxi=primero;while(auxi!=NULL){

    if(strcmp(auxi->nombre,id)==0)auxi->tipo=codi;

    auxi=auxi->sig;

    }

    }

    int busca(char id[]){TDS * auxi;auxi=primero;retortipo=0;while(auxi!=NULL){

    if(strcmp(auxi->nombre,id)==0){ retortipo=auxi->tipo;break; }

    auxi=auxi->sig;

    }return retortipo;}

    void cargavalor(int tipo, char id[]){TDS * auxi;auxi=primero;while(auxi!=NULL){

    if(strcmp(auxi->nombre,id)==0){if(tipo==1)

    auxi->valore=valoren;if(tipo==2)

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    26/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    27/66

    #include #include extern struct nam; /* tabla de variables */

    %}%%int {strcpy(yylval.tipo,yytext);return INT;}real {strcpy(yylval.tipo,yytext);return REAL;}

    char {strcpy(yylval.tipo,yytext);return CHAR;}de {return DE;}array {return ARRAY;}

    ([0-9]+) {yylval.entval=atoi(yytext);return NUMBER;}([0-9]*\.[0-9]+) {yylval.realval = atof(yytext); return NUMREAL; }

    [ \t] ;

    [a-z]+ {strcpy(yylval.nam.nome,yytext); return NAME;}

    \n |. return (yytext[0]);

    %%

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    28/66

    CAPITULO 3

    AMBIENTES PARA EL MOMENTODE LA EJECUCIN

    Captulo 3

    Consideraciones para el momento de la ejecucin

    3.2Aspectos del lenguaje fuenteSupongamos que un lenguaje permite la utilizacin de procedimientos, para unaprogramacin modular.Un Procedimiento es una declaracin, que en su forma ms simple, asocia unidentificador con una proposicin. El identificador es el nombre del procedimiento, y laproposicin es el cuerpo del procedimiento. Los procedimientos que devuelven valoresse denominan funciones en muchos lenguajes; sin embargo, es mejor llamarlosprocedimientos. Un programa completo tambin se considera un procedimiento.Cuando aparece el nombre de un procedimiento dentro de una proposicin ejecutable,

    se dice que el procedimiento es llamadoen dicho momento. La idea bsica es que lallamada a un procedimiento ejecuta el cuerpo del procedimiento.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    29/66

    Algunos de los identificadores que aparecen en la definicin de un procedimiento sonespeciales y se denominan parmetros formales del procedimiento. Los parmetrosactuales pueden pasarse a un procedimiento llamado; son sustituidos por los parmetrosformales.

    3.2 Arboles de activacinSe tienen en cuenta los siguientes supuestos sobre el flujo de control entreprocedimientos durante la ejecucin de un programa:

    1. El control fluye secuencialmente; es decir, la ejecucin de un programa consta deuna secuencia de pasos, y el control est en algn punto especfico del programa acada paso.

    2. Cada ejecucin de un procedimiento comienza al principio del cuerpo delprocedimiento y en algn momento devuelve el control al punto situadoinmediatamente tras el lugar donde fue llamado el procedimiento. Esto significa quepuede describirse el flujo del control entre procedimientos utilizando rboles comose ver.

    Cada ejecucin del cuerpo del procedimiento se considera una activacin delprocedimiento. La duracinde una activacin de un procedimiento p es la secuencia depasos entre el primero y el ltimo paso de la ejecucin del cuerpo del procedimiento,incluido el tiempo que se tarda en ejecutar los procedimientos llamados por p, los

    procedimientos llamados por ellos, y as sucesivamente. El general, el trmino"duracin" se refiere a una secuencia consecutiva de pasos durante la ejecucin de unprograma.

    Un procedimiento es recursivo si puede comenzar una nueva activacin antes de quehaya terminado una activacin anterior del mismo procedimiento.Un procedimiento recursivo p no necesita llamarse a s mismo directamente; p puedellamar a otro procedimiento q, que puede entonces llamar a p a travs de una secuenciade llamadas a procedimientos. Se puede utilizar un rbol, llamado rbol de activacin,para representar la forma en que el control entra y sale de las activaciones. En un rbolde activaciones:1. Cada nodo representa una activacin de un procedimiento.2. La raz representa la activacin del programa principal.3. El nodo para a es el padre del nodo para b, si y solo si, el control fluye de la

    activacin de a la de b4. El nodo para a est a la izquierda del nodo para b, si y solo si, la duracin de a

    ocurre antes que la duracin de b.

    Como cada nodo representa una activacin nica, y viceversa, conviene decir que elcontrol est en un nodo cuando est en la activacin representada por el nodo.

    Ejemplo

    Programa PIr a A con x,yMientras .....Si w=C(v)

    Salir

    Sino.......

    Procedure AParmetros f,g....Si f > .....

    Ir a B

    Sino.....FinSiretornar

    Procedure BImprimir ....

    .........retornar

    Entero FuncinC(t)

    ...........retornar ( i)

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    30/66

    FinSiFin MientrasIr a BFin

    Una posible secuencia de ejecucin de P y sus mdulosLa ejecucin comienza ....

    Entra al programa PEntra al procedimiento A con los parmetros x e yEntra al procedimiento BSale del procedimiento BSale del procedimiento AEntra a la funcin C con tSale de la funcin CEntra al procedimiento BSale del procedimiento BSale del programa P (termina+ ejecucin)

    Un rbol de activacin correspondiente a la salida anterior:P

    A(f,g) C(t) B

    BFig. 1

    3.3 Pilas de Control

    El flujo de control de un programa corresponde a un recorrido en profundidad del rbolde activacin que comienza en la raz, visita un nodo antes que a sus hijos y visita loshijos en cada nodo recursivamente de izquierda a derecha.Se puede utilizar un pila, llamada Pila de Control para llevar un registro de lasactivaciones de los procedimientos en curso. Se trata de introducir el nodo para una

    activacin en una pila de control cuando comience la activacin, y sacarlo cuandotermine. Los contenidos de la pila de control se relacionarn con los caminos hacia laraz del rbol de activaciones. Cuando el nodo n est en el tope de la pila de control, lapila contendr los nodos situados a lo largo del camino de n hasta la raz.

    Del caso anterior supondremos que B este activo desde su llamada del programaprincipal P, el rbol de activaciones y la pila de control sern:

    P

    A(f,g) C(t) B

    B

    P

    B

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    31/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    32/66

    3.6 ORGANIZACIN DE LA MEMORIA3.6.1 Subdivisin de la memoria durante la ejecucin

    Supngase que el compilador obtiene un bloque de memoria del sistema operativo paraque se ejecute el programa compilado. Esta memoria, para el momento de la ejecucin,debe estar subdividida de modo que pueda albergar:1. el cdigo objeto generado

    2. los objetos de datos, y3. una contrapartida de la pila de control para registrar las activaciones de

    procedimientos.

    El cdigo objeto generado tiene un determinado tamao en el momento de lacompilacin, as que el compilador puede colocarlo estticamente en una zona, tal vezen el extremo inferior de la memoria. De manera similar, tambin se puede conocer eltamao de algunos de los datos en el momento de la compilacin, y por tanto tambin sepueden colocar en una zona estticamente. Una razn para asignar estticamente tantosdatos como sea posible es que las direcciones de dichos objetos se pueden compilarjunto al cdigo objeto.

    Fig. 4 Subdivisin tpica de la memoria durante la ejecucin en reas de cdigo y dedatos.

    Un rea distinta de la memoria para el momento de la ejecucin, llamada montculo,guarda el resto de la informacin. Pascal y otros lenguajes permiten que los datos seasignen durante el control del programa; la memoria para dichos datos se toma delmontculo. Las implantaciones de lenguajes en los que las duraciones de lasactivaciones no se pueden representar con un rbol de activaciones, pueden utilizar lapila para guardar la informacin sobre las activaciones. La forma controlada en que seasignan y desasignan los datos en una pila hace que sea menos costoso colocar los datosen la pila que en el montculo.Los tamaos de la pila y del montculo pueden variar durante la ejecucin del programa,

    as que se colocan en los extremos opuestos de la memoria, donde pueden crecer el unohacia el otro, convenientemente. Ej. C y Pascal.

    Cdigo

    Datos estticos

    Pila

    Montculo

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    33/66

    Por norma, las pilas crecen hacia "abajo". Es decir, el "tope" de la pila se dibuja hacia laparte inferior de la pgina. Como las direcciones de memoria aumentan conforme serecorre la pgina, el "crecimiento hacia abajo" significa hacia direcciones superiores. Si"tope" marca el tope de la pila, se pueden calcular los desplazamientos desde el tope dela pila restando el desplazamiento a tope.

    3.6.2 Registros de activacinLa informacin necesaria para una sola ejecucin de un procedimiento, se consigue

    utilizando un bloque contiguo de memoria llamado registro de activacin o marco, queconsta del conjunto de campos que se muestra en la siguiente figura. No todos loslenguajes ni todos los compiladores utilizan la totalidad de estos campos. A menudo losregistros pueden sustituir uno o ms campos. Para lenguajes como Pascal y C,normalmente se introduce el registro de activacin de un procedimiento en la pila deejecucin cuando se llama al procedimiento y se extrae de la pila cuando el controlregresa al autor de la llamada.

    Fig. 5 Un registro de activacin general

    3.6.3 Disposicin Espacial de los datos locales en el momento de la compilacin

    Supngase que la memoria para la ejecucin se obtiene en bloques de bytes contiguos,

    donde un byte es la mnima unidad de memoria direccionable. En muchas mquinas, unbyte consta de 8 bits y cierto nmero de bytes forman una palabra de mquina. Los

    Valor devuelto

    Parmetros actuales

    Enlace de controlopcional

    Utilizado por el procedimiento que recibe la llamadapara devolver un valor al procedimiento autor de lallamada. En la rctica a un re istro

    Utilizado por el procedimiento autor de la llamada para

    proporcionar parmetros al procedimiento que recibe lallamada. En la prctica se suele pasar a registros de mquina

    Apunta al registro de activacin del autor de la llamada.

    Enlace de accesoopcional

    Estado de la mquinaguardado

    Datos locales

    temporales

    Se utiliza para hacer referencia a los datos no localesguardados en otros registros de activacin

    Contiene informacin sobre el estado de la mquina justoantes de que sea llamado el procedimiento. Estainformacin incluye los valores del contador del programa ylos registros de la mquina que deben reponerse cuando elcontrol regrese del procedimiento.

    Guarda los datos locales a una ejecucin de unprocedimiento.

    Los valores temporales como los que surgen en laevaluacin de expresiones, se almacenan en el campo

    ara valores tem orales.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    34/66

    objetos multibyte (arreglos, por ej,) se almacenan en bytes consecutivos y se les da ladireccin del primer byte.La cantidad de memoria necesaria para un nombre (variable) viene determinada por sutipo. Un tipo de datos elemental, como un carcter, un entero o un real, generalmente sepuede almacenar en un nmero entero de bytes. La memoria para un dato compuesto,como una matriz o un registro, debe ser lo suficientemente grande como para dar cabidaa todos sus componentes. Para acceder fcilmente a los componentes, la memoria paraestos tipos, se coloca generalmente en un bloque contiguo de bytes.

    El campo para los datos locales, en el registro de activacin, se concreta conforme seexaminan las declaraciones en un procedimiento durante la compilacin. Los datos delongitud variable (pilas, colas, listas, rboles, grafos, etc.) se mantiene fuera de estecampo. Se hace un recuento de las posiciones de memoria asignadas a declaracionesanteriores. Segn el resultado, se determina una direccin relativa de la memoria paraun valor local con respecto a alguna posicin, como el comienzo del registro deactivacin. La direccin relativa, o desplazamiento, es la diferencia entre las direccionesde esa posicin y del objeto de datos.

    3.8ESTRATEGIAS PARA LA ASIGNACION DE MEMORIA

    En cada una de las tres reas de datos de la Fig. 4, se utiliza una estrategia distinta para

    la asignacin de memoria.La asignacin esttica dispone la memoria para todos los objetos de datos durante lacompilacin.

    La asignacin por medio de una pila trata la memoria en ejecucin como una pila.La asignacin por medio de un montculo asigna y desasigna la memoria conforme se

    necesita durante la ejecucin a partir de un rea de datos conocida como montculo.

    Estas estrategias de asignacin se aplican a los registros de activacin.

    3.7.1 Asignacin estticaEn la asignacin esttica, los nombres se ligan a la memoria durante la compilacin delprograma, as que no es necesario un paquete de apoyo para la ejecucin. Como losenlaces no cambian durante la ejecucin, cada vez que se activa un procedimiento, susnombres (identificadores) se enlazan a las mismas posiciones de memoria. Esta

    propiedad permite que los valores de los nombres locales sean retenidos durante lasactivaciones de un procedimiento. Es decir, cuando el control regresa a unprocedimiento, los valores de las variables locales son los mismos que cuando el controlsali por ltima vez.Segn el tipo de un nombre, el compilador determina la cantidad de memoria que debereservarse para dicho nombre. La direccin de esta memoria consta de undesplazamiento desde un extremo del registro de activacin del procedimiento. Elcompilador debe decidir a dnde van los registros de activacin, con respecto al cdigoobjeto y a otro registro de activacin. Una vez tomada esta decisin, queda determinadala posicin de cada registro de activacin, y por tanto de la memoria para cada nombredentro del registro. Durante la compilacin se pueden ahora proporcionar lasdirecciones en las que el cdigo objeto puede encontrar los datos con los que opera.Sin embargo, utilizar nicamente la asignacin esttica conlleva algunas limitaciones:

    a) El tamao de un objeto de datos y las limitaciones en cuanto a su posicin en lamemoria deben conocerse en el momento de la compilacin.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    35/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    36/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    37/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    38/66

    2. El procedimiento autor de la llamada evala los parmetros actuales y coloca susvalores de lado derecho en las direcciones de memoria de los parmetrosformales.

    Una caracterstica distintiva de la llamada por valor es que las operaciones sobre losparmetros formales no afectan a los valores en el registro de activacin del autor dela llamada.

    EjemploA : integerB : integer

    Leer ALeer BSi A > B

    Si multiplo(A,B)=0Imprimir "el valor " A "es mltiplo de " B

    FinsiSinoSi multiplo(B,A)=0

    Imprimir "el valor " B "es mltiplo de " AFinsi

    FinsiFin

    Fig. 8 : Llamada por valor, para paso de parmetros a la funcin multiplo.

    3.8.2 Llamada por ReferenciaCuando los parmetros se pasan por referencia (llamada por direccin o por posicin),el autor de la llamada pasa al procedimiento llamado un apuntador a la direccin dememoria de cada parmetro actual.1. Si un parmetro actual es un nombre o una expresin que tenga un valor de lado

    izquierdo, entonces se pasa ese mismo valor de lado izquierdo.

    2. Sin embargo, si el parmetro actual es una expresin, como a+b o 3, que no tieneningn valor de lado izquierdo, entonces la expresin se evala en una nuevaposicin, y se pasa la direccin de dicha posicin.

    Una referencia a un parmetro formal en el procedimiento llamado se convierte, en elcdigo objeto, en una referencia indirecta a travs del apuntador pasado alprocedimiento llamado.

    EjemploA : integerB : integer

    Leer ALeer B

    Resto : integer

    Funcin multiplo (x: integer, y: integer)Resto :integerResto = xMientras Resto >=yResto = Resto - y

    Fin mientrasRetornar Resto

    Funcin multiplo (x : *intger, y : * integer,R: * integer)*R = *x

    Mientras *R >= *y*R = *R - *y

    Fin mientrasRetornar *R

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    39/66

    Si A > BSi multiplo(&A,&B,&Resto)=0

    Imprimir "el valor " A "es mltiplo de " BFinsi

    SinoSi multiplo(B,A)=0

    Imprimir "el valor " B "es mltiplo de " AFinsi

    FinsiFin

    Fig. 9 : Llamada por referencia, para paso de parmetros a la funcin multiplo.

    3.8.3 Copia y Restauracin

    Un hbrido entre la llamada por valor y la llamada por referencia es el enlazado de copiay restauracin.

    1. Antes de que el control fluya al procedimiento llamado, se evalan los parmetros

    actuales. Los valores de lado derecho de los parmetros actuales se pasan alprocedimiento llamado como en la llamada por valor. Adems, sin embargo, losvalores de lado izquierdo de estos parmetros actuales con valores de lado izquierdose determinan antes de la llamada.

    2.3. Cuando el control retorna, los valores de lado derecho en curso de los parmetros

    formales se copian de retorno en los valores de lado izquierdo de los parmetrosreales, utilizando los valores de lado izquierdo calculados antes de la llamada. Slose copia en los parmetros actuales con valores de lado izquierdo, por supuesto.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    40/66

    Ejercicios del CaptuloRESPONDE EL SIGUINTE CUESTIONARIO PARA GUIAR EL APRENDIZAJEAspectos del Lenguaje fuente Cul es la definicin formal de un procedimiento? A qu se refiere el trmino activacin? Qu representa un rbol de activaciones? Explica como se calcula la duracin de una activacin

    Que datos contiene la pila de control A que se refiere el enlace de un nombre? Que valores determinan las funcionesambiente y estado?

    Organizacin de la memoria Cmo podra organizar un compilador la memoria, asignada por el Sistema

    Operativo?. Mencionen cada componente de dicha organizacin y una brevedescripcin de estos.

    Qu son los registros de activacin? Para qu se utilizan?. Cmo se estructuran estosregistros.

    Describe la utilidad de cada campo de un Registro de activacin. A qu se refiere el trmino de disposicin espacial en memoria? Cmo se determina la memoria para tipos bsicos y los estructurados ( estticos y

    dinmicos)? Explica el concepto de desplazamiento.

    Estrategias para la asignacin de memoria Qu ventajas ofrece la asignacin esttica? Qu limitaciones tiene, esta estrategia de asignacin? Describe un proyecto de compilador sencillo que utilice solo este tipo de estrategia

    de asignacin (esttica). En que se basa la asignacin por medio de una pila?. Qu caractersticas importantes

    se puede mencionar de este tipo de asignacin? Ejemplifica un caso de asignacin por pila de una secuencia de llamadas de

    procedimientos. Explica, por medio de este ejemplo, las ventajas y desventajas deesta estrategia.

    Estrategias para la asignacin de memoria

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    41/66

    En que casos, se podra utilizar la asignacin por montculo, en sustitucin deasignacin por pila?

    Ejemplifica grficamente, utilizando representac7in de los registros de activacin,cmo funciona una asignacin por montculo.

    Paso de parmetros Qu se entiende por paso de parmetros? Explica los tipos de pasos de parmetros y ejemplifica cada uno de ellos.

    Ejercicios Prcticos1. Qu mtodo para asignacin de memoria, podra ser utilizado en la

    Programacin Orientada a Objetos?. Por qu?2. Para el procedimiento A de la pgina 3, disea su registro de activacin.3. Grafica el rbol de activaciones y la pila de control, cuando, de acuerdo al sigt.

    Resumen de un programa, se est ejecutando la funcin Errores.

    Programa Anlisis

    Llamada a Lxico...Llamada a ComposicinFin del programa

    4. Justifica porque las siguientes proposiciones son falsas :a) Los enlaces de nombres constituyen la contrapartida dinmica de la definicin de un

    procedimiento.b) La duracin de un procedimiento se refiere al tiempo que se espera para su llamada.c) El cdigo objeto y los datos estticos son direcciones a posiciones de memoria

    denominadas como montculo.d) Los registros de activacin se apilan y desapilan, estticamente en el momento de

    la compilacin.e) Los procedimientos recursivos son escasos, en las asignaciones estticas, porque

    demandan mucho espacio en memoria.

    5. Considera el siguiente cdigo en C++main()int x, y, z;carga();cin>>x;cin>>y;cin>>z;if (x!=y)z=busca(x);if(z==busca(y))

    salida( );z= fibo(x);coutx;cin>>y;}

    Int busca(int w ){....if( w>=0)return 1;

    }

    Int fibo(int p ){if(p==1|| p==0)return 1;

    elsereturn fibo(p-1)+fibo(p-2);

    }

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    42/66

    return 0;}

    a) Graficar el rbol de activaciones cuando en main(), x=1, y = 5 y z=20 , y seencuentra en ejecucin la lnea if(p==1|| p==0). 3p

    b) Graficar la pila de control cuando se activaron carga y salida ( con respecto alarbol de item a) 2p

    6. Disea ejemplos prcticos para los siguientes casos :a) Una pila de control de activaciones con 3 elementos en la misma.

    b) Un compilador que utilice asignacin esttica de memoria.c) Una pila de control con paso de parmetros por referencia.d) Una tabla de smbolos para un lenguaje que permite la programacin con

    procedimientos.

    CAPTULO 4

    GENERACIN DE CDIGOINTERMEDIO

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    43/66

    Captulo 44.1 Generacion de codigo intermedio

    Consiste en traducir el Programa fuente a una representacin intermedia a partir del cualla etapa final genera el cdigo objeto.

    Ventajas de un codigo intermedio1) Facilidad para la traduccin a cdigo objeto a distintas mquinas.

    2) Posibilidad de aplicar un optimizador al cdigo intermedio independientementede la mquina.

    Ubicacin de generador de codigo intermedio

    ANALIZADOR COMPROBADOR GENERADOR GENERADORSINTACTICO ESTTICO CODIGO cdigo CODIGO

    INTERMEDIO intermedio OBJETO

    4.2 Lenguajes intermediosSi las declaraciones de nombres no se introducen en el cdigo intermedio la tabla de

    smbolos deber estar presente hasta la generacin del cdigo objeto.

    1) ARBOLES SINTACTICOS

    Los rboles sintcticos permiten una estructura jerarquica de las sentencias. En lasexpresiones y proposiciones, los operadores se sitan en los nodos intermedios y losoperandos en las hojas.

    Ejemplo : para la sentencia a = b * -c + b * -cEl rbol sintctico ser :

    =

    a +

    * *

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    44/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    45/66

    rbol de anlisis sintctico rbol sintctico

    derivacin por derecha:S=> id = E => id= E+ E => id= E + id => id = id + id

    Construye los rboles de anlisis sintctico y el rbol sintctico

    2) NOTACION POSTFIJA (NOTACION POLACA INVERSA)

    La notacin polaca inversa la desarroll Jan Lukasiewicz en 1920 como unaforma de escribir expresiones matemticas sin tener que utilizar parntesis y corchetes.Hewlett-Packard Co., al darse cuenta de que el mtodo de Lukasiewicz era mejor quelas expresiones algebraicas estndar (1) al utilizar calculadoras y ordenadores, adapt lanotacin polaca para su primera calculadora cientfica de mano, la hp35, en 1972.

    Bsicamente notacin RPN (Reverse Polish Notation (notacin polaca inversa)), es unalista de nodos de un rbol en la que un nodo aparece inmediatamente despus de sushijos. Lo que significa un recorrido en post-orden de los nodos de una estructura tiporbol:nodo hij o izquierdo - nodo hi jo derecho - nodo padre.

    Dado el rbol

    =

    a +

    b c La notacin polaca de la misma ser :abc+=

    Ejemplo de Gramtica para generacin de notacin polaca:

    S id {print (id)} = E {print (=)}E T RE - T {print(-)}E ( E )R + T {print (+)} RR + T {print (*)} RR eT id {print (id)}

    Escribe derivaciones por izquierda y derecha para a = b + c, grafica el rbol de anlisissintctico y las salidas segn las acciones semnticas asociadas a la gramtica.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    46/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    47/66

    Operador Resultado

    Hay algunas instrucciones que carecen de estos elementos; los tercetos que sepueden usar son:

    Asignacin binaria: x = y op z op: operador aritmtico o lgico Asignacin unaria: x = op y op unario: negacin, conversor de tipo,

    direccionamiento. Asignacin simple o copia: x = y Salto incondicional: goto etiqueta Salto condicional: if x oprelacional y goto etiqueta Para manejo de procedimientos con sus parmetros. Se utiliza manejos u

    operaciones en la pila para guardar o acceder a estos datos :param x mete el parmetro a la pilacall p, n llamada al procedimiento p, y el dato que debe tomar n

    parmetros del tope de la pila.pop x accede al parmetro x de la pilareturn y retorna el valor y

    Asignacin indexada: x = y[i] ; x[i] = yDonde x e y son direcciones bases e i el desplazamiento

    Asignacin indirecta: x = &y ; x = *y Son asignaciones dedirecciones y asignaciones de punteros.

    El conjunto de operadores debe ser lo bastante amplio para implantar lasoperaciones del lenguaje fuente.

    Ejemplo de cdigo de tercetosc = alabel etqciclo

    if b = 0 goto etqFinb = b 1c = c + 1

    goto etqciclolabel etqFin

    4.3 CODIGO DE TERCETOS PARA EXPRESIONESCuando se genera cdigo de tercetos, se construyen variables temporales para losnodos interiores del rbol sintctico. As, si por ejemplo tuviramos la entrada

    a = 3 + b + 5 + ca = 3 + b + 5 + c

    temp1temp2

    temp3temp1 = 3 + b

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    48/66

    temp2 = temp1 + 5temp3 = temp2 + ca = temp3

    Las variables temporales sirven para almacenar resultados intermedios a medida quevamos calculando el resultado final.

    Estas variables temporales se generan, durante el reconocimiento de los pivotes de las

    producciones.

    Gramtica de Expresiones: G( ) ID ASIG {.nombre=ID.nombre;printf(.nombre=expr.nombre );}

    | ID ASIG {.nombre=ID.nombre; printf(.nombre=.nombre);}

    + {.nombre=otra_etq( );printf(.nombre=.nombre+ .nombre);}

    | - {.nombre=otra_etq( );printf(.nombre=.nombre- .nombre);}

    | * {.nombre=otra_etq( );printf(.nombre=.nombre* .nombre);}

    | / {.nombre=otra_etq( );printf(.nombre=.nombre/ .nombre);}

    | - {.nombre=otra_etq( );printf(.nombre=-.nombre);}

    | () {.nombre= .nombre);}

    | NUMERO {.nombre= NUMERO.nombre; }

    | ID {.nombre= ID.nombre;}

    Un ejemplo de sentencia sera a = b + 5prog

    asig {asig.nombre = a ; print( a = tmp1)}

    expr {expr.nombre=tmp1; print(tmp1=b+5)}

    expr {expr.nombre=b} expr {expr.nombe = 5}

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    49/66

    a = b + 5

    Entonces en un anlisis ascendente, el cdigo intermedio para a= b +5, sertmp1 = b + 5a = tmp1

    Ejercicios :

    1) Escribe en cdigo YACC, la gramtica y las acciones semnticas para generarcdigo intermedio para la gramtica de asignaciones.

    2) Escribe cdigo intermedio, segn la gramtica vista, para las sentencias :medio = ( auxiliar + b) / 15x = ( (f +g ) * 2 ) + ( x y)a = b= c= (- d + 2 ) * (r 58)

    4.4 Generacin de cdigo de Tercetos en Sentencias de ControlUtilizando cdigo de tercetos, vamos a generar ahora el cdigo correspondiente no sloa las expresiones, sino tambin el correspondiente a las sentencias de control.

    En el caso de las expresiones, nos basbamos en las variables temporales para generarcdigo.

    Ahora el problema son los cambios de flujos:

    IF - THEN- ELSECASEWHILEREPEAT

    4.3.1. Sentencia I F

    Por ejemplo, si tenemos una instruccin como:

    Entrada Salida

    IF A > 0 THENS1 := 1;ELSES2 := 2;FIN SI;

    Ahora vamos a ver cmo vamos a generar el cdigo anterior.En el momento en el que ponemos el no terminalsent, justo detrs est generado sucdigo, segn la regla de produccin:

    Una posible regla gramatical para producir sentencias de condicin simple, sera:

    if A > 0 goto etq1goto etq2label etq1S1 = 1goto etq3label etq2S2 = 2label etq3

    Al reconocer cond se debegenerar las lineas 1 y 2. La lnea 3 luego del THEN,

    antes de la sentencia1

    Etq3 sera la etiqueta de fin dela estructura, se asocia al IF, segenera despues de la sentencia1 aligual que las lineas 5 y 6

    La lnea 8 se genera despuesde la sentencia2.

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    50/66

    sent : IF cond THEN sent ELSE sent

    | ID ASIG expr

    Hay que poner el cdigo que existe entre las dos sentencias, esto podramos hacerlomediante la inclusin de reglas intermedias.

    cond : expr > expr { strcpy($$.etq_verdad, otra_etq( ) );

    strcpy($$.etq_falso, otra_etq( ) );printf(if %s > %s goto %s, $1,$3,$$.etq_verdad);printf(\n goto %s, $$.etq_falso); }

    Las acciones semnticas en la regla del I Fqued :

    sent : IF cond THEN {printf(label %s \n, $2.etq_verdad); } sent { strcpy($1.etq_fin,otra_etq( ));printf(goto %s \n,$1.etq_fin);printf(label %s \n,$2.etq_falso);}

    ELSE sent {printf(label %s \n, $1.etq_fin); } ENDIF

    Por ejemplo: IF A+3 > 0 THEN B= A+5 ENDIF Desarrolla su cdigo detercetos.

    Condicin compuesta : Si se enlazan condiciones mediante operadores lgicos AND uOR emplearemos la tcnica del cortocircuito, de manera que si enlazamos cond1 ycond2 con un AND, (cond1 AND cond2), pues si cond1 es falso, no evaluaremos cond2,dado que su funcin ser falsa sea cual sea el valor de cond2.Si el conector es OR, (cond1 OR cond2), la cond2 slo se evaluar si la cond1 es falsa,pues en caso contrario, su disyuncin ser verdad para cualquier valor de cond2.

    Por ejemplo:Sea : Se traduce a :IF (A >B) AND (B>C) THENS1 := 1;FIN IF;

    if A > B goto etq4goto etq5 cond1label etq4if B>C goto etq6goto etq7 cond2label etq5goto etq7label etq6S = 1goto etq8label etq7label etq8

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    51/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    52/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    53/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    54/66

    Ejercicios :Dada las sentecias

    while a > 0 dob = b + 5

    a = a -1fin while

    Escribir la traduccin a cdigo de tercetos de acuerdo a las reglas y acciones semnticasvistas anteriormente.

    4.3.4 Sentencia CASELa sentencia ms compleja de todas es la sentencia CASE, ya que sta permite unnmero indeterminado, y potencialmente infinito de condiciones, lo cual obliga aarrastrar una serie de parmetros a medida que se van efectuando reducciones.

    repeatb= b+5a=a-1until a=0

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    55/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    56/66

    Si tenemos:CASE A OF

    CASO 1 : S1;CASO 7: S2;.....

    FIN CASE

    Completa como sera el cdigo generado:

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    57/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    58/66

    El cdigo completo para la sentencia ser:

    sent_case : inicio_case OTHERWISE sent ';' FIN CASE { printf("label%s\n",$1.etq_final); }

    | inicio_case FIN CASE { printf("label %s\n",$1.etq_final);};

    inicio_case : CASE expr OF { strcpy($$.variable_expr,$2);nueva_etq($$.etq_final); }

    | inicio_case CASO expr':' {nueva_etq($2); printf("\tif %s != %s goto%s\n", $1.variable_expr,$3,$2); }sent ';'

    {printf("\tgoto %s\n",$1.etq_final);printf("label %s\n",$2);

    strcpy($$.variable_expr,$1.variable_expr);strcpy($$.etq_final,$1.etq_final);}

    ;

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    59/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    60/66

    strcpy($$.etq_falso,nueva_etq( ));printf("\tif %s > %s goto s\n",$1.nombre,$3.nombre,$$.etq_verdad);printf("\tgoto %s\n",$$.etq_falso);

    }| expr '

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    61/66

    OBS.: El DO... WHILE ejecuta una sentencia y verifica la condicin al final de laconstruccin, si la misma es verdadera la iteracin continua.Debes incluir su correspondiente analizador Lxico.

    Anexo1

    Un Generador de Cdigo Intermedio escrito en Yacc, y su respectivo cdigo Lex.Est gramtica atribuida, no realiza anlisis semntico, previamente. Queda comotarea para el alumno o la alumna, disear y desarrollar un generador, para estamisma gramtica, que incluya la comprobacin semntica

    %{/*ejem6y.yac*/struct struct_doble_cond

    {char etq_verdad[21];char etq_falso[21];};

    typedef struct struct_doble_cond doble_cond;

    struct struct_datos_case{char etq_final[21];char variable_expr[21];};

    typedef struct struct_datos_case datos_case;%}%union {

    int numero;char variable_aux[21];char etiqueta_aux[];char etiqueta_siguiente[21];doble_cond bloque_cond;datos_case bloque_case;

    }%token NUMERO%token ID%token IF WHILE REPEAT%token CASO%token ASIG THEN ELSE FIN DO UNTIL CASE OF OTHERWISE%token MAI MEI DIF

    %type expr%type cond%type inicio_case%left OR%left AND

    %left NOT%left '+''-'

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    62/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    63/66

    lista_sent :

    | lista_sent sent ';'| lista_sent error ';' {yyerror;};

    sent_case : inicio_caseOTHERWISE sent ';'

    FIN CASE{printf("label %s\n",$1.etq_final);}

    | inicio_caseFIN CASE

    {printf("label %s\n",$1.etq_final);}

    ;

    inicio_case : CASE expr OF{strcpy($$.variable_expr,$2);

    nueva_etq($$.etq_final);}| inicio_case

    CASO expr ':'{nueva_etq($2);printf("\t if %s!=%s goto

    %s\n",$1.variable_expr,$3,$2);}

    sent ';'{printf("\t goto %s\n",$1.etq_final);printf("label %s\n",$2);

    strcpy($$.variable_expr,$1.variable_expr);

    strcpy($$.etq_final,$1.etq_final);}

    ;

    expr : NUMERO {nueva_var($$);printf("\t %s=%d;\n",$$,$1);}

    | ID {strcpy($$,$1);}

    | expr'+'expr {nueva_var($$);

    printf("\t%s=%s+%s;\n",$$,$1,$3);}

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    64/66

    | expr'-'expr {nueva_var($$);printf("\t%s=%s-%s;\n",$$,$1,$3);}

    | expr'*'expr {nueva_var($$);printf("\t%s=%s*%s;\n",$$,$1,$3);}

    | expr'/'expr {nueva_var($$);printf("\t%s=%s/%s;\n",$$,$1,$3);}

    | '-'expr %prec MENOS_UNARIO {nueva_var($$);printf("\t%s=-%s;\n",$$,$2);}

    | '('expr')' {strcpy($$,$2);}

    ;

    cond : expr '>' expr { nueva_etq($$.etq_verdad);nueva_etq($$.etq_falso);printf("\tif %s > %s goto %s\n",$1,$3,$$.etq_verdad);printf("\tgoto %s\n",$$.etq_falso);

    }| expr '

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    65/66

  • 7/22/2019 APUNTES COMPILADORES II.pdf

    66/66

    }void nueva_etq(char *s){static actual=0;strcpy(s,&"etq");itoa(++actual,&(s[3]),10);}

    Anexo2 :%{/*ejem6l.lex*/int linea_actual=1;%}%START COMENT%%^[\t]*"*" {BEGIN COMENT;}.+ {;}\N {BEGIN 0; linea_actual++;}":=" {return ASIG;}">=" {return MAI;}"