Vous êtes sur la page 1sur 52

Introduccin

El diseo y la programacin de un compilador se ha convertido, de una tarea artstica, a un conjunto de metodologas sencillas para realizar las diferentes fases de un compilador. En los libros de textos existentes que abarcan el tema de diseo de compiladores se mencionan tcnicas especficas sobre anlisis lexicogrfico, anlisis sintctico, optimizacin de cdigo etc. Pero, generalmente, lo que no se ha logrado estructurar de una manera clara es la fase de generacin de cdigo, tanto intermedio como objeto. El principal propsito de la presente gua, es mostrar una tcnica sencilla de generacin de cdigo, utilizando diagramas de sintaxis, de tal manera que el diseo de un traductor sea una labor completamente sencilla.

Ing. Elda G. Quiroga

TRADUCTORES

LENGUAJES
Lenguaje
Es un conjunto de vocablos, con los cuales se pueden estructurar ideas, de acuerdo a un patrn sintctico.

TIPOS DE LENGUAJES
Lenguaje Natural
Lenguaje natural es el conjunto de vocablos por medio de los cuales el hombre elabora, expresa y comunica sus ideas. Una caracterstica fundamental del lenguaje natural es que el significado de una palabra puede depender del contexto en el que se ubique. Por ejemplo, analicemos las siguientes oraciones: El nio toma leche El nio toma el camin El nio toma la mano El nio toma el ejemplo A pesar de que la secuencia sintctica de las oraciones anteriores es la misma, el significado de la palabra toma depende de las palabras que le sucedan.

Lenguajes Artificiales
Un lenguaje artificial toma elementos propios y de otros lenguajes para formar su estructura. Por ejemplo, el Esperanto es un lenguaje artificial. Los lenguajes computacionales pertenecen a esta rama de lenguajes.

Lenguajes Artificiales Abstractos


Se le llama lenguaje abstracto a aqul que se define con el nico propsito de experimentar nuevas estructuras o reglas de construccin.

Lenguajes Artificiales Computacionales


Se han llamado lenguajes artificiales computacionales a aqullos que se emplean para expresar un algoritmo. Las estructuras que se forman son llamadas instrucciones y se emplean para programar una computadora. Un lenguaje artificial est formado por un lxico y est regido por una estructura sintctica menos flexible, es decir, con menos alternativas, que la estructura sintctica de un lenguaje natural. Una caracterstica de un lenguaje artificial es que el sinificado de una palabra siempre es el mismo, no depende del contexto en el que se encuentre. En esta gua, concentraremos nuestra atencin en el estudio de lenguajes artificiales y su procesamiento. Los lenguajes artificiales computacionales, tambin conocidos como lenguajes de programacin, estn clasificados por niveles. El lenguaje de ms bajo nivel es el lenguaje maquinal. El hardware de la computadora slo puede ejecutar las instrucciones expresadas en este lenguaje. El lenguaje ensamblador permite el uso de mnemnicos para expresar instrucciones que pertenecen al lenguaje maquinal. Los lenguajes de alto nivel, permiten el uso de palabras y de estructuras que hacen posible la conversin casi directa de un algoritmo en un programa.

Ing. Elda G. Quiroga

TRADUCTORES

Un lenguaje es de mayor nivel que otro, cuando su estructura sintctica permite formar instrucciones que expresan un mayor nmero de instrucciones primitivas en lenguaje maquinal. Dado que una computadora slo puede procesar instrucciones expresadas en lenguaje maquinal, se requiere de traductores para tener la posibilidad de ejecutar programas escritos en lenguajes de mayor nivel.

Estructura de un lenguaje
Anteriormente definimos lenguaje como un conjunto de vocablos con los cuales se pueden estructurar ideas. Ahora vamos a ampliar esta definicin, de la siguiente manera: Un lenguaje contiene un conjunto de vocablos que forman el lxico o vocabulario del lenguaje. En lenguajes naturales, a los vocablos se les llama simplemente palabras. Las palabras representan una imagen, ya sea fsica o abstracta. En lenguajes de programacin, a los vocablos les llamaremos tomos o tokens. Para definir el lxico de un lenguaje es posible emplear la notacin de conjuntos, por ejemplo, el lxico del lenguaje espaol es: {rbol, casa, perro........}. Tambin se puede emplear una notacin especial llamada expresiones regulares. Las palabras y los tokens son concatenaciones de smbolos. Dichos smbolos forman parte de un alfabeto. Para definir el alfabeto de un lenguaje se utiliza notacin de conjuntos. Ejemplo, el alfabeto del lenguaje espaol es: {a,b,c,d.........} Para construir ideas, es necesario establecer una secuencia de palabras, respetando un patrn sintctico. La Sintaxis tiene que ver con el orden en el que se acomoda el lxico; es el estudio de las relaciones permitidas entre las palabras. Un patrn sintctico es aqul que muestra las normas rectoras de las relaciones permitidas entre los elementos del lxico de un lenguaje. Para definir las reglas sintcticas de un lenguajes existen varias alternativas: definir una gramtica, un diagrama de sintaxis, o en algunos casos, una expresin regular. Uns palabra guarda un significado, y ste depende de la imagen que representa, pero el significado puede variar dependiendo de las otras palabras con las que haya sido relacionada. Se le llama semntica al estudio del significado de las palabras. En los lenguajes de programacin, la semntica de las instrucciones tiene una dependencia directa con la secuencia sintctica que se haya utilizado, en cambio en los lenguajes naturales puede suceder lo que ya mencionamos anteriormente: El nio toma el camin El nio toma la mano O peor an, una misma oracin puede representar varios significados, por ejemplo: Te veo en el caf - significado: te ver ms tarde en una cafetera Te veo en el caf - significado: te veo reflejada en mi taza de caf Si pensamos en todas las complicaciones que involucra el anlisis de un lenguaje natural, nos resultar sencillo pensar en el procesamiento de un lenguaje de programacin.

Ing. Elda G. Quiroga

TRADUCTORES

Diseo de un Lenguaje de Programacin


La tarea de definir un lenguaje involucra un anlisis cuidadoso de la aplicacin que tendr, y del tipo de usuarios que lo van a utilizar. Cuando la persona que va a disear el lenguaje est muy familiarizado con diversos lenguajes de programacin, es muy frecuente que caiga en la tentacin de usar formatos que conoce, pero esto ocasiona que se olvide de los usuarios finales. Por ejemplo, si el lenguaje que se va a disear se integrar a un paquete administrativo, y va a tener un uso muy especfico, y las personas que lo utilizarn no tienen una cultura computacional, entonces no tiene caso que las palabras reservadas estn escritas en ingls, y sera tedioso que los mensajes de error aparecieran slo con una clave, o que hicieran mencin a tecnisismos tales como "este procedimiento genera demasiado cdigo", sera conveniente cambiar este mensaje por otro que dijera "favor de dividir su procedimiento, ya que contiene demasiadas instrucciones". Los pasos que esta gua recomienda seguir para definir un lenguaje de programacin son los siguientes: - Buscar reas de oportunidad No se debe olvidar que al incluir un lenguaje a un sistema computacional, se generar la capacidad de resolver infinito nmero de problemas que pertenezcan a la misma clase. Una vez que definimos qu tipo de problemas queremos resolver, debemos experimentar con diferentes alternativas de planteamientos de solucin de problemas involucrando en la experimentacin a los posibles usuarios, y de ah podremos observar los estatutos que son convenientes incluir en el lenguaje. -Definir la orientacin del lenguaje Debe estar muy clara la orientacin que se le va a dar al lenguaje ya que de ello depende el tipo de estatutos, el nivel o potencia de los estatutos y las estructuras de datos que se debern incluir. - Definir estatutos Se recomienda no basarse completamente en algn otro lenguaje de programacin ya que esto puede menguar la creatividad del diseador. Lo que se puede hacer es tomar lo mejor de los lenguajes que existan y tengan la misma orientacin y de ah aadir innovaciones que den potencia al lenguaje y lo hagan prctico y til. No se deber olvidar incluir estatutos de:
Entrada y salida. Condicionales. Ciclos. Asigancin. Referencias a subrutinas y/o mtodos.

-Definir estructuras de datos Una de las labores ms complejas de un traductor es la de resolver las estructuras de datos que permita el lenguaje, as es que se debe analizar detenidamente el tipo de estructuras que son estrictamente necesarias dada la orientacin del lenguaje. -Definir las expresiones Las expresiones, tanto aritmticas como booleanas son parte primordial de un lenguaje, tomando en cuenta la orientacin del lenguaje, es importante incluir operadores, que no necesariamente tienen que existir en la aritmtica tradicional. Piense en el lenguaje C y observe lo til que son operadores como el ++, *= etc. y que constituyeron una innovacin introducida por este lenguaje. Una vez establecidos los operadores, se deber fijar la jerarqua que seguir la evaluacin de una expresin.

Ing. Elda G. Quiroga

TRADUCTORES

-Definir las reglas semnticas Se debern definir reglas para las expresiones sin restringir demasiado la combinacin de tipos dado que esto es fcil de manejar por el traductor, pero sin perder de vista la orientacin del lenguaje. Tambin se debern definir reglas para los estatutos restringiendo slo los casos en los que no se pueda hacer una traduccin. Por ejemplo, en el estatuto CASE de Pascal no se puede utilizar un expresin que sea de tipo real o string, pero sera muy sencillo modificar el tipo de traduccin que realiza el compilador para que estos tipos sean aceptados, de ah podemos ver que es una restriccin innecesaria. - Definir la sintaxis Para las palabras reservadas se deben de utilizar nombres mnemnicos, no muy largos, y de ser posible incluir sinnimos o abreviaciones, ya que para el compilador es sencillo contemplar esta posibilidad. Debe ser congruente la secuencia de los estatutos, para que los usuarios puedan memorizar fcilmente la sintaxis del lenguaje, la terminacin de los estatutos debe ser similar. La definicin de la sintaxis se debe construir sobre diagramas, ya que es la manera ms clara de observar todos los rdenes posibles. Los signos de puntuacin se deben de incluir hasta el momento de definir los diagramas, y se deben incluir en caso de indeterminacin o ambiguedad. En caso de que los signos sean necesarios, se debern incluir a lo largo de todo el lenguaje. Si no son indispensables, entonces se puede incluir la posibilidad de que sean opcionales. Si el mtodo de anlisis sintctico que se va a seguir requiere de una gramtica, entonces una vez definidos los diagramas de sintaxis, se podr disear la gramtica a partir de stos. La primer gramtica que se disee debe ser sencilla y que muestre una equivalencia clara con los diagramas. Si el mtodo de anlisis sintctico requiere de que la gramtica cumpla ciertas condiciones, entonces se deber arreglar la gramtica, conservando como parte de la documentacin todas las versiones a las que se haya llegado, para ayudar a la depuracin de errores. Es conveniente conservar una copia de los diagramas de sintaxis con marcas que hagan referencia a los nombres de los smbolos no terminales que se utilizaron.

Ing. Elda G. Quiroga

TRADUCTORES

TEORA DE LENGUAJES
Es una notacin utilizada para representar patrones de lxico y patrones sintcticos. "STRINGS" Y LENGUAJES. Un ALFABETO es un conjunto finito de smbolos, donde stos son letras, dgitos o cualquier caracter. Por ejemplo el conjunto {0,1,2,3,4,5,6,7,8,9) es el alfabeto del sistema decimal. Una CADENA o "STRING" es una secuencia finita de smbolos que son elementos de un alfabeto. Los nmeros 1234 , 345, 987, 65 son algunos ejemplos de "strings" sobre el alfabeto decimal. La LONGITUD de una cadena se representa por dos lneas verticales |23|, y da como resultado el nmero de smbolos de la cadena. Asi la cadena | compiladores | tiene longitud 12. El "string" VACIO (o NULO) se representa por el smbolo

y tiene una longitud cero.

Un LENGUAJE es cualquier conjunto de "strings" sobre un alfabeto. OPERACIONES SOBRE STRINGS. CONCATENACION. La concatenacin se representa por rs donde r y s son "strings" . Si r = libre y s = comercio el "string" resultante al realizar la concatenacin de rs = librecomercio que es diferente de sr=comerciolibre. El elemento identidad de la concatenacin es el string vaco. Asi

r = r = r

EXPONENCIACION.

Para todo string S elevado al exponente i se obtiene Si i = 0 entonces S0 = Si i > 0 entonces Si = Si-1 S

OPERACIONES EN LENGUAJES
Existen muchas operaciones que se pueden aplicar a lenguajes. Para representar los patrones de lxico primero nos interesan la unin, concatenacin y la cerradura (clousure), mismas que se definen en la siguiente tabla:

OPERACION Union de L y M Concatenacin de L y M Kleene closure de L Positive closure de L

REPRESENTACION LUM LM * L + L

DEFINICION
L U M = { s | s est en L o M } LM = {m | l est en L y m est en M }

* L

=U i=0 + L =U
i=1

Li Li * L = L

Ing. Elda G. Quiroga

TRADUCTORES

EXPRESIONES REGULARES
Las expresiones regulares son una notacin especial que facilita la tarea de representar en forma precisa las reglas de lxico. Las expresiones regulares, al igual que las expresiones aritmticas, permiten que se realicen cierto tipo de operaciones sobre ellas. Las expresiones regulares son 'generadoras' de lenguajes, es decir, dada la expresin regular R, existe un lenguaje generado por R, denominado L(R).

TERMINOLOGIA UTILIZADA:

w,x,y

* +

Alfabeto utilizado (conjunto finito de smbolos). elemento del conjunto cadenas de smbolos tomados de . cadena ("string") nula. conjunto vaco. conjunto de todas las cadenas generadas a partir de . Contiene a como una cadena vlida.

conjunto de todas las cadenas generadas a partir de . En este conjunto es una cadena invlida.

OPERACIONES SOBRE UNA EXPRESION REGULAR.


Sean R y S dos expresiones regulares, entonces las operaciones que se pueden realizar sobre R y S se definen como: 1). Alternativa. Representa la unin de dos expresiones regulares, sta se denota por:

R|S RS
3).

R+S RUS RS

2). Concatenacin. Representa la 'concatenacin' de dos cadenas generadas por R y por S respectivamente, sta se denota como: Exponenciacin. Representa la repeticin controlada de una expresin regular ('n' concatenaciones de la exp. regular consigo misma), esta operacin se define recursivamente como:

R | S = { w | (w R) (w S) } RS = { wx | (w R) y (x S) }

4). Cerradura de Kleene (Kleene Clousure). Representa la repeticin de una expresin regular (cero ms concatenaciones de la exp. regular consigo misma), esta operacin se define como:

R o = { }

R1 = R
R * = Ri
i=0

Ri = R Ri-1

= Ro U R1 U R2 ............

5). Cerradura Positiva (Positive Clousure). Representa la repeticin de una expresin regular, (una ms concatenaciones de la exp. regular consigo misma) esta operacin se define como:

R + = Ri
i=1

= R1 U R2 ............

6). Opcin (seleccin). Permite que una expresin regular pueda no aparecer, sta 'operacin' se define como:

[ R ] R? = Ro U R1

Ing. Elda G. Quiroga

TRADUCTORES

Formalmente, una expresin regular se define por:


Sea un alfabeto, entonces las expresiones regulares sobre y los conjuntos que denotan, se definen recursivamente como sigue:

1. es una expresin regular que denota el conjunto vaco. 2. es una expresin regular y denota el conjunto {}, el cual es <> 3. Para cada , es una expresin regular y denota el conjunto {}. 4. Si R y S son expresiones regulares que generan respectivamente L(R) y L(S), entonces: (R) | (S) es una expresin regular que representa a L(R) U L(S). (R) (S) es una expresin regular que representa a L(R)L(S) (R) es una expresin regular que representa a L(R) R* es una expresin regular que representa a (L(R))*
5. Las operaciones de Cerradura Positiva, Exponenciacin y Seleccin se pueden representar a partir de las operaciones definidas en el punto anterior. 6. Ninguna expresin que no cumpla con los puntos arriba especificados ser considerada una expresin regular. Los parentesis se pueden eliminar tomando en cuenta la siguiente jerarqua de operadores (se listan de mayor a menor jerarqua) y tienen asociatividad izquierda: ++ -1. 2. 3. 4. ( ) cerraduras, exponenciacin. concatenacin. alternativa (unin).

PROPIEDADES ALGEBRAICAS DE LAS EXPRESIONES REGULARES.


Las propiedades algebraicas son leyes que cumplen las expresiones regulares y ademas se utilizan en la manipulacin de las mismas.

PROPIEDAD r|m=m|r r | (m | g) = (r | m) | g (rm)g = r(mg)


r(m|g) = rm | rg (m|g)r = mr | gr

DESCRIPCION | es conmutativa | es asociativa la concatenacin es asociativa


la concatenacin es distibutiva sobre la | es el elemento identidad de la concatenacin es el elemento identidad de la alternativa

r=r =r

| r = r | = r
r* = (r | r*

)* = (r + | )

la relacin entre * y la relacin entre *, * es idempotente

+ y

r** = r*

Ing. Elda G. Quiroga

TRADUCTORES

TEORIA DE GRAMATICAS
GRAMATICA.
Notacin formal empleada para representar las reglas sintcticas de un lenguaje. Una gramtica se compone de los siguientes tres elementos: 1. Un conjunto finito de smbolos terminales (T).
donde un smbolo terminal es cada uno de los lexemas que genera Lxico.

2. Un conjunto finito de smbolos llamados no_terminales (N) que incluye al smbolo inicial S (Smbolo sentencial).
Un smbolo No_terminal es una variable til para agrupar cadenas de smbolos gramaticales (terminales y no_terminales/variables sintcticas) que forman construcciones sintcticas.

3. Un conjunto finito de producciones (P) de la forma: String1 String2


donde : String1 puede ser cualquier secuencia de smbolos gramaticales que tiene al menos una variable sintctica (no_terminal). String2 es cualquier secuencia de smbolos gramaticales.

Se utilizan para especificar la manera en la cual los smbolos gramaticales se pueden combinar para formar patrones sintcticos vlidos. Sin embargo la forma ms general de representar una gramtica es mediante un cuadrplo de la forma: G = ( N , T , P , S ). Ejemplo de una gramtica es: G1 = ({X, S}, {a, b}, P, S ) donde:
a y b son terminales, X y S son no terminales, S es el smbolo sentencial, y las producciones (P) son:

S XS S X aX X a aaaX ba

DERIVACION.
Una derivacin en una gramtica es una serie de terminales y no_terminales que se obtienen, por medio de sustituciones utilizando las producciones de la gramtica, donde la primera inicia en el smbolo sentencial S, y terminan cuando tenemos un string formado solamente de terminales. Ejemplo. derivar el "string" ababa utilizando la gramtica G1 anterior

S XS aXS aaXS aaaXS aaaaXS abaXS abaaXS abaaaXS abaaaaXS ababaS ababa

Ing. Elda G. Quiroga

TRADUCTORES

10

LENGUAJE
El lenguaje generado por una gramtica es el conjunto de todos los strings formados solamente de smbolos terminales que pueden ser derivados a partir del smbolo sentencial S. ARBOL SINTACTICO ARBOL DE DERIVACION. Un rbol sintctico es la representacin grfica de una derivacin. Las hojas del rbol son terminales y los nodos son variables sintcticas que, ledas de izquierda a derecha (en cualquiera de los niveles del rbol) crean lo que se conoce como forma sentencial.

DIAGRAMAS DE SINTAXIS / GRAMTICAS GRFICAS


Otra alternativa para una gramtica es representarla en forma grfica utilizando Diagramas de Sintaxis. En trminos generales, un diagrama de sintaxis se define como una herramienta til para representar, de manera sencilla, el orden que deben seguir los elementos del lenguaje. La aplicacin principal de los mismos, como su nombre lo indica, es representar los patrones sintcticos de los lenguajes, utilizando para ello uno o varios diagramas, dentro de los cuales debe existir uno que lleve el nombre del smbolo sentencial de la gramtica. A continuacin se presenta la notacin utilizada para definir los diagramas de sintaxis. NOTACION DE LOS DIAGRAMAS DE SINTAXIS.
<N> Nombre del diagrama de sintaxis.

Referencia a un diagrama de sintaxis.

Indica la secuencia del orden a seguir

Referencia a un smbolo terminal

Los diagrama de sintaxis poseen patrones que se repiten constantemente por lo tanto es de suma importancia definirlos, ya que ello facilitar el diseo de los mismos. A continuacin se presenta un conjunto de diagramas de sintaxis con los patrones sintcticos (o estructuras sintcticas) ms comunes : a) Secuencia de smbolos <X>
a b

<X> a <Y>

El primer diagrama indica que el patrn sintctico <X> est formada por 'a' seguido de 'b'. El segundo diagrama indica que <X> inicia con el smbolo 'a' seguido por el patrn sintctico <Y>. b) Alternativa entre varios smbolos
<X> a b

Ing. Elda G. Quiroga

TRADUCTORES

11

Este diagrama indica que la estructura <X> puede ser formada indistintamente por el smbolo 'a' por el smbolo 'b' pero no ambos. c) Estructuras Cclicas
<X> a <X> a ,

El primer diagrama indica que <X> aceptar cadenas formadas por una ms 'a'; mientras que el segundo aceptar ms de una 'a' siempre y cuando venga separada por una ','. Cuando una estructura sintctica es muy compleja, es recomendable fraccionarla en pequeos diagramas que representen operaciones bsicas.

Clasificacin de Gramticas
Debido al tipo de representacin que se utiliza para denotar las reglas sintcticas de un lenguaje, las gramticas se dividen en dos grandes grupos:

Gramticas Grficas.
Comnmente llamadas Diagramas de Sintaxis. Sirven para representar en forma esquemtica ciertos tipos de reglas sintcticas. No son tan generales como las gramticas formales. Los expertos No las consideran gramticas formales, debido a la falta de definicin matemtica de stas y a que no aceptan los mismos tipos de lenguajes que las gramticas formales.

Gramticas Formales.
Son gramticas que se utilizan para representar las reglas de construccin de diversos tipos de lenguajes. Estas gramticas forman parte de la "Teora de los lenguajes formales". Uno de los principales investigadores en esta rea es Noam Chomsky, quien en 1959 public "Propiedades Formales de las Gramticas" en el cual mostr el modelo matemtico correspondiente a una gramtica para la representacin del lenguaje natural. Adicionalmente proporcion una clasificacin general para las gramticas, partiendo de las caractersticas particulares de los lenguajes que cada una de ellas acepta. Actualmente esa clasificacin es ampliamente aceptada y se le conoce como : "JERARQUIA DE CHOMSKY". En esta jerarqua se distinguen 4 tipos principales de gramticas, los cuales son: 0.- Sin Restricciones (Unrestricted grammars UG Tipo 0) Como su nombre lo indica, las reglas de produccin de estas gramticas no siguen ningn patrn prestablecido, no existe ningn tipo de restriccin para su construccin. No son tiles para representar los lenguajes artificiales (de programacin). 1.- Sensitivas al contexto (Context_Sensitive grammars CSG Tipo 1) Son gramticas cuyas reglas de produccin presentan ciertas restricciones para su construccin. En estas gramticas, las reglas de produccin siempre se presentan como: X Y en las que, | X | <= | Y |, donde | X | representa la longitud de la cadena de smbolos gramaticales. Adicionalmente, X y Y son elementos de (N U T)* y X contiene al menos un elemento de N y Y no puede llegar a ser vaco. Se llaman Sensitivas al contexto porque las sustituciones que se

Ing. Elda G. Quiroga

TRADUCTORES

12

realizan de los smbolos No-terminales (por su forma sentencial lado derecho de la regla de produccin correspondiente) se llevan a cabo nicamente si ese smbolo aparece en el contexto adecuado. Los lenguajes que se generan a partir de una gramtica sensitiva al contexto se denominan Lenguajes Sensitivos al Contexto. 2.- Libre de contexto (Context_Free grammars CFG Tipo 2) En este tipo de gramticas, las reglas de produccin presentan restricciones adicionales a las que se tenan el las CSG. En este tipo de gramticas, las reglas de produccin son de la forma: X Y donde, X es elemento de los smbolos No-terminales y | X | = 1, es decir, slo existe un smbolo del lado izquierdo de la produccin y es No-terminal. Adems Y es una cadena de smbolos gramaticales que son elementos de (N U T)*. En estas gramticas, la produccin X (que denota a la cadena nula) es vlida. Aunque siempre existir una gramtica equivalente que no utilice este tipo de producciones.

Se llaman libre de contexto porque las sustituciones que se realizan de los smbolos Noterminales (por su forma sentencial lado derecho de la regla de produccin correspondiente) se llevan a cabo independientemente del contexto en que aparezcan (es decir, no importando qu smbolos se encuentren en la vecindad del smbolo a sustituir). An cuando las gramticas libres de contexto no son lo suficientemente poderosas para representar el lenguaje natural, stas son las ms tiles para representar los lenguajes artificiales. Los lenguajes que se generan a partir de una gramtica libre de contexto se denominan Lenguajes libres de contexto. 3.- Regulares (Regular grammars RG Tipo 3) Las reglas de produccin de este tipo de gramticas presentan la mayor cantidad de restricciones para su construccin. Dichas reglas de produccin son de la forma: X Y donde, X es elemento de los smbolos No-terminales y | X | = 1, es decir, slo existe un smbolo del lado izquierdo de la produccin y es No-terminal. Adems Y es una cadena de smbolos gramaticales con elementos de ( N U T)*, pero | Y | <=2. Si | Y | =1, el smbolo que forma a Y deber ser un elemento de los Terminales; por el contrario si | Y| = 2, Y tendr la forma aB Ba, donde a es elemento de los Terminales y B ser elemento de los No-terminales. En estas gramticas, la produccin X (que denota a la cadena nula) es vlida si y slo si X es el smbolo inicial de la gramtica. Dentro de este tipo de gramticas, existe una subdivisin adicional que depende de la forma que tengan las reglas de produccin, dicha subdivisin se define como: - Gramticas Lineales Derechas : Aqu todas las producciones son de la forma: X a X aB. - Gramticas Lineales Izquierdas : Aqu todas las producciones son de la forma: X a X Ba.

Los lenguajes que se generan a partir de gramticas regulares son denominados Lenguajes regulares, para los cuales tambin existe una representacin en un Autmata de Estados Finitos y en una expresin regular. La jerarqua de estas gramticas y las relaciones entre ellas, se da como: L(G3)

L(G2) C

L(G1) C

L(G0)

donde C significa subconjunto de

En la siguiente tabla se muestra un resuen de los tipos de gramticas y las restricciones que tienen las producciones de cada una de ellas.

Ing. Elda G. Quiroga

TRADUCTORES

13

JERARQUIA DE CHOMSKY(1959).
tipo Nombre Restricciones en las producciones

XY

Sin Restricciones (Unrestricted Grammar)

X = cualquier string, al menos tiene un smbolo no_terminal Y = cualquier string

Sensitivas al Contexto (Context Sensitive Grammar)

X = cualquier string, al menos tiene un smbolo no_terminal Y = cualquier string de longitud igual o mayor que la de X. X = un solo smbolo no_terminal Y = cualquier string

Libres de Contexto (Context Free Grammar)

Regulares (Regular Grammar)

X = un solo smbolo no_terminal Y = TN o Y = T Y = NT o Y = T

Ahora que se conoce la clasificacin de las gramticas formales, cabe sealar que las gramticas grficas (diagramas de sintaxis) son tiles para representar nicamente gramticas libres de contexto y gramticas regulares. Esa es una de las razones por las que no son reconocidas estrictamente como gramticas. EQUIVALENCIAS ENTRE DIAGRAMAS Y GRAMATICAS LIBRES DE CONTEXTO. A continuacin se presenta un conjunto de diagramas de sintaxis con los patrones sintcticos ms comunes, junto con la gramtica libre de contexto y la expresion regular equivalentes.

Ing. Elda G. Quiroga

TRADUCTORES

14

PATRONES SINTACTICOS MAS COMUNES. a) Estructura de alternativa. <X> a Gramtica equivalente X->a X->b Expresin Regular X=(a|b) b b) Estructura de Secuencia. <X> a b Expresin Regular X=ab c) Estructuras cclicas. Gramticas equivalentes 1) X->Xa X->a 2) X->aX X->a Expresin Regular +X=a 2) <X> a Gramtica equivalente X->ab

1 ) <X> a

Gramticas equivalentes 1) X->Xa X-> 2) X->aX X-> Expresin Regular * X=a

d) Estructuras cclicas con separador. 1) <X> a ; Gramticas equivalentes 1) X->X;a X->a 2) X->a;X X->a Expresin Regular X=a(;a)* ; 2) <X> a

Gramtica equivalente X->aY X-> Y->;aY Y-> Expresin Regular X= ( | a(;a)*)

Ing. Elda G. Quiroga

TRADUCTORES

15

TRANSFORMACION DE UN DIAGRAMA A UNA GRAMATICA LIBRE DE CONTEXTO. 1. Marcar en el diagrama de sintaxis los patrones sintcticos que existan. 2. Asignar un smbolo no terminal que no exista a cada uno de los patrones que se marcaron en el paso anterior. 3. Obtener la gramtica libre de contexto equivalente de cada uno de los patrones. 4. Obtener la(s) produccion(es) del diagrama utilizando los smbolo no terminales que identifican a cada patron. A continuacin se muestran los cuatro pasos a seguir para obtener la gramtica libre de contexto equivalente al diagrama de sintaxis siguiente:
1. <X> b c d

<D> 2. <X> b c d <B> <C> ;

3.

<B> <B> b <B> <X>

<C> c <C> c <C>

<D> d D> d ; <D>

4.

<B><C><D>

Ing. Elda G. Quiroga

TRADUCTORES

16

GRAMATICAS

Definiciones Formales

Definicin General de una Gramtica (sin importar su clasificacin). Una gramtica se representa en un cudruplo de forma: G = (N , T , P , S) donde: N = Conjunto de Smbolos No-Terminales (o variables sintcticas). T = Conjunto de Smbolos Terminales (lexemas). Siempre se cumple que: N T = S = Smbolo No-Terminal que se distingue por generar todas las cadenas vlidas para un lenguaje definido. Se le denomina Smbolo Inicial Smbolo Sentencial; donde (S N , pero S (N U T)*) NOTA: (N U T)* Es el conjunto de smbolos gramaticales. (N U T)* representa todas las posibles combinaciones. P = Conjunto no vaco de relaciones que van de (N U T)* N (N U T)* hacia (N U T)*, en general : P (N U T)* (N U T)* Lo anterior significa que P es un subconjunto de todas las posibles relaciones entre los smbolos gramticales. La representacin de esta relacin es: donde (N U T)* N (N U T)* y (N U T)* es llamado el lado izquierdo y el lado derecho de la relacin. Estas relaciones son llamadas reglas sintcticas o de sustitucin, tambin se le llaman producciones (ya que son el resultado de un producto).

DERIVACIONES SUSTITUCIONES La sustitucin o derivacin, formalmente se define como, una relacin binaria ( ) sobre el conjunto (N U T)*, tal que, para cualquier y (N U T)* y cualquier produccin se define , donde y pueden ser strings nulos ( ).

Sea G= (N,T,P,S) una gramtica; entonces para cualquier (N U T)* se dice que es DIRECTAMENTE DERIVABLE de ( ) si existen strings y (N U T)* tales que = y = y P

Tambin se denomina produce directamente a Es el resultado de aplicar UNA SOLA regla.

se reduce directamente a . , ....,

(N U T)* se dice que Sea G= (N,T,P,S) una gramtica; entonces para cualquier produce a deriva a ( ) si existen strings , (n>0) (N U T)* tales que = = (n pasos de derivacin)

........

es la cerradura transitiva de La relacin transitiva reflexiva de como:

. Si n = 0, entonces se define la cerradura =

Ing. Elda G. Quiroga

TRADUCTORES

17

FORMA SENTENCIAL Sea G= (N,T,P,S) una gramtica. Sea (N U T)*. Se dice que es una Forma Sentencial de G S (derivando a partir del Smbolo Inicial se obtiene )

SENTENCIA (ORACION) es una Sentencia de G S Se dice que Forma Sentencial)

T*

(Toda sentencia es una

ARBOL DE DERIVACION ( Sintctico). Sea G= (N,T,P,S) una gramtica. Se dice que un rbol T es un Arbol de Derivacin para G si: 1. Cada nodo del rbol tiene una etiqueta X (su nombre), donde X (N U T)*. 2. El nombre de la raz es S (smbolo inicial). 3. Si un nodo N tiene al menos un descendiente, y dicho nodo se llama X, entonces X N 4. Si los nodos N , N ,...N son descendientes directos de N, en orden de izquierda a derecha y se llaman respectivamente A , A ,....,A , entonces

A A A ....A P 5. Si un nodo N se llama , entonces es un nodo hoja y

es el nico descendiente de su padre. 6. Ninguna otra cosa puede ser considerado un rbol de derivacin.

Todas las hojas de un rbol de derivacin de izquierda a derecha representan una forma sentencial para G. TIPOS DE DERIVACION El orden en que se llevan a cabo las sustituciones determina el tipo de derivacin que se est utilizando. Las derivaciones pueden ser : Ms a la Izquierda (M.I.) , Ms a la derecha (M.D.) o Aleatorio. (La ms utilizada de las tres es la derivacin Ms Izquierda) DERIVACION DE MAS A LA IZQUIERDA. En cada paso de derivacin SIEMPRE se sustituye al smbolo No-Terminal que se encuentra ms a la izquierda en la Forma Sentencial. Este tipo de derivacin se representa como :

DERIVACION DE MAS A LA DERECHA. En cada paso de derivacin SIEMPRE se sustituye al smbolo No-Terminal que se encuentra ms a la derecha en la Forma Sentencial. Este tipo de derivacin se representa como :

DERIVACION ALEATORIA. No existe un orden para realizar las sustituciones. (No tiene aplicacin prctica). Ejemplo: G = ({S,L}, {i, , , (, ) } , P, S } 1) S ( L ) 2) S i

3) L

L , S4) L

La derivacin de ms a la izquierda de la expresin ( i, i ) es: S ( L ) ( L , S ) ( S , S ) ( i , S ) ( i , i ) La derivacin de ms a la derecha de la expresin ( i, i ) es:

(L)

(L,S)

(L,i)

(S,i)

(i,i)

Ing. Elda G. Quiroga

TRADUCTORES

18

S11 ( 13 L 14 S 2 L1 , ) S 1 5 i ( 14 L 15 S

S1 1 2 L1 , ) S 13 i

i Arbol de derivacin de ms a la izquierda

i Arbol de derivacin de ms a la derecha

Los nmeron indican el orden en que los smbolos no terminales fueron derivados. LENGUAJE GENERADO POR UNA GRAMATICA G. L(G) Sea G= (N,T,P,S) una gramtica. El lenguaje generado por G, llamado L(G) es el conjunto de todos los strings formados por SIMBOLOS TERMINALES, tales que:

L(G) = { w / (w

T*) y ( S

w)

Ambigedad en Gramticas
A continuacin se presentan conceptos importantes dentro del estudio de las caractersticas de las gramticas: AMBIGEDAD: Sea G = { N , T , P , S } una gramtica libre de contexto y sea L(G) el lenguaje generado por esa gramtica. Si existe un string w (donde w L(G) ) para el cual existen dos ms formas de realizar la derivacin de ms a la izquierda ( S w ) existen dos ms formas de realizar la derivacin de ms a la derecha ( S w ), entonces se dice que: G es una gramtica ambigua.

TIPOS DE AMBIGEDAD: Dentro del estudio de gramticas existen dos tipos fundamentales de ambigedad, los cuales son: Ambigedad Inherente: Las gramticas que presentan este tipo de ambigedad no pueden utilizarse para lenguajes de programacin, ya que por ms transformacines que se realicen sobre ellas, NUNCA se podr eliminar completamente la ambigedad que presentan. Ambigedad Transitoria: Este tipo de ambigedad puede llegar a ser eliminada realizando una serie de transformaciones sobre la gramtica original. Una vez que se logra lo anterior, la gramtica queda lista para ser reconocida por la mayor parte de los analizadores sintcticos. (Se le considera "ambigedad" porque existen mtodos para realizar anlisis sintctico que no aceptan gramticas con estas caractersticas)
Ing. Elda G. Quiroga TRADUCTORES 19

Dnde se presenta la Ambigedad Transitoria: Generalmente la ambigedad se presenta cuando existen producciones con factores comunes (distintas alternativas para un smbolo no-terminal que inician de la misma forma); cuando existen producciones que son recursivas izquierdas (producciones para un smbolo no-terminal en las cuales el primer smbolo de su forma sentencial es ese mismo smbolo no-terminal). Cmo solucionar el problema de la Ambigedad Transitoria?: Para eliminar este tipo de ambigedad, es necesario, primero eliminar: - Factores comunes izquierdos inmediatos y No-inmediatos. - Recursividad izquierda inmediata y No-inmediata.

OPERACIONES SOBRE GRAMATICAS LIBRES DE CONTEXTO: ELIMINACIN DE AMBIGEDAD TRANSITORIA


FACTORIZACION DE TERMINOS COMUNES IZQUIERDOS INMEDIATOS. Existen gramticas que tiene producciones de la forma

1 | 2
S

como por ejemplo donde

es el trmino comn en las producciones de A.

iEtSeS

| iEtS

Sin embargo para poder llevar a cabo el anlisis sintctico de las mismas mediante algunas tcnicas se debe eliminar los trminos comunes izquierdos llevando a cabo el proceso de factorizacin siguiente: Las producciones A

A A A | 2

1 | 2

se transforman en las siguientes

las cuales nos generan el mismo lenguaje. Existe un nuevo smbolo no terminal A en la gramtica, el cual no altera la gramtica del lenguaje. Generalizando el procedimiento para n producciones de A que tienen factor comn izquierdo: 1. Agrupar todas las producciones de A, sin importar cuantas sean.

*donde representa otras producciones de A que no tienen factor comn izquierdo .

1 | 2 | ... | n |

2. Remplazar las producciones de A a un conjunto equivalente mediante la siguiente transformacin

A A | A 1 | 2 | ... | n

Ing. Elda G. Quiroga

TRADUCTORES

20

ELIMINACION DE RECURSIVIDAD IZQUIERDA INMEDIATA. Una gramtica tiene recursividad izquierda si tiene un no terminal A tal que existe una derivacin A A para algn string . Algunas tcnicas de anlisis sintctico no pueden manejar gramticas con recursividad izquierda por ello se debe eliminar primero.

Pasos para eliminar la recursividad izquierda inmediata. 1. Agrupar todas las producciones de A, sin importar cuantas sean.

A 1 |

2 | ... | A m | 1 | 2 | ... | n
mediante la siguiente

donde i no inicia con A. 2. Reemplazar las producciones de A a un conjunto equivalente transformacin :

A A

1 A | 2 A | ... | n A 1 A | 2 A | ... | m A |

En el caso de obtener producciones con recursividad izquierda al momento de realizar este segundo paso, se debe repetir el procedimiento. ELIMINACION DE LA AMBIGEDAD TRANSITORIA NO-INMEDIATA: Este tipo de ambigedad se presenta cuando, despus de realizar un conjunto de sustituciones se generan factores comunes recursividad izquierda. Para poder eliminarla, ee deben sustituir todas las alternativas de los smbolos No-terminales involucrados para convertir esa ambigedad No-inmediata en inmediata, para posteriormente aplicar las reglas expuestas anteriormente.

OPERACIONES SOBRE GRAMATICAS LIBRES DE CONTEXTO: CLCULO DE FIRSTs Y FOLLOWs


CALCULO DE FIRST PARA UNA GRAMATICA. El donde es cualquier secuencia de smbolos (N U T)* ser un conjunto de smbolos terminales, con los que pueden iniciar las derivacines a partir de

FIRST(),

Para calcular el para todos los smbolos de aplicar las siguientes reglas hasta que no se puedan aadir ms terminales a cualquier FIRST 1. Si X es terminal, entonces aadir X al FIRST(X). 2. Si X es una produccin de G, entonces aadir al FIRST(X). 3. Si X es una produccin de G entonces

FIRST()

Y1Y2Y3Y4...YK
:

-aadir el FIRST(Y 1 ) al FIRST(X). -aadir el FIRST(Y 2 ) al FIRST(X) si y solo si el FIRST(Y 1 ) tiene

-aadir el FIRST(Y k) al FIRST(X) si y solo si el FIRST(Y 1 ) & FIRST(Y 2 ) .. &FIRST(Y k-1) tienen . -y por ltimo aadir al FIRST(X) si y solo el s el FIRST(Y 1 ) & FIRST(Y 2 ) .. & FIRST(Y k) tienen .

Ing. Elda G. Quiroga

TRADUCTORES

21

CALCULO DE FOLLOW PARA UNA GRAMATICA. El FOLLOW( ), para un no terminal , ser el conjunto de terminales a que pueden aparecer inmediatamente a la derecha del no terminal en alguna forma sentencial, esto es, el conjunto de terminales que pueden existir en una derivacin de la forma para alguna Si es el smbolo no terminal ms a la derecha en alguna forma sentencial, entonces (eof) est en el FOLLOW( ).

. A

a SAa

Para calcular el FOLLOW(A) para todos los no_terminales A de la gramtica G, aplicar las siguientes reglas a cada produccin hasta que ya no se puedan aadir elementos al conjunto de FOLLOW. 1. Aadir el $ en el FOLLOW(S), donde S es el smbolo sentencial de la gramtica y $ es el smbolo que marca el fin de la entrada. 2. Si existe una produccin A en la gramtica G, entonces todo lo que est en el FIRST se aade en el FOLLOW excepto 3. Si existe una produccin o una produccin en la gramtica G, donde el FIRST contiene entonces aadir todo lo que este en el FOLLOW(A) en el FOLLOW(B).

()

B AB ,

(B),

()

AB

Ing. Elda G. Quiroga

TRADUCTORES

22

ANLISIS DE SINTAXIS
Metodologas TOP-DOWN
Es aquel anlisis sintctico que inicia la derivacin de un string a partir del smbolo sentencial y trata de encontrar la derivacin ms a la izquierda para el "string" que se est analizando. Es un tipo de metodologa EXPANSIVA, ya que, partiendo nicamente del Smbolo Sentencial, va expandiendo el rbol hasta obtener la secuencia de tokens ms parecida al string de entrada que s es vlida para el lenguaje. Las metodologas Top-Down tienen la ventaja de ser muy sencillas, sin embargo, dada la naturaleza de su construccin aceptan un nmero limitado de gramticas (no soportan ambigedades). Entre las ms comunes se encuentran: - Descenso Recursivo (tambin llamado Predictivo Recursivo). - El mtodo Predictivo (tambin llamado Predictivo NO-Recursivo).

Metodologas BOTTOM-UP
Conocido tambien como shift-reduce parsing, construye un rbol sintctico para un string de entrada iniciando en las hojas del rbol (bottom) y lleva a cabo reemplazamientos hasta llegar a la raz (smbolo sentencial). En general reduce un string w al smbolo sentencial de la gramtica. Es un tipo de metodologa denominada REDUCCIONISTA ya que, partiendo de las hojas de un supuesto rbol de derivacin, va realizando reducciones hasta llegar a la raz del rbol. Si el archivo de entrada es correcto y, en cada paso se eligi la sustitucin adecuadamente, se obtendr un Derivacin ms a la Derecha en Reversa. Estas metodologas no son tan evidentes como las Top-Down, sin embargo son mucho ms poderosas que stas y soportan una mayor cantidad de gramticas (incluyendo algunas ambigedades temporales). Entre las ms comunes se encuentran: - La familia de metodologas LR: LR-Simple, LR-Cannico y LALR. Ejemplo. Para G = ( a, b, c, d, e | A, B, S | S )

1) SaABe 2) AAbc 3) Ab 4) Bd

El anlisis bottom-up del string abbcde es: 3 2 4

abbcde aAbcde aAde aABe S


4

Los nmeros indican el nmero de la produccin que se aplic.

El anlisis Top-down del string abbcde es: 1 2 3

S aABe aAbcBe abbcBe abbcde

Ing. Elda G. Quiroga

TRADUCTORES

23

MTODOS TOP-DOWN
Estas metodologas tratan de encontrar el rbol con la derivacin de ms a la izquierda para un string de entrada. Son tcnicas EXPANSIVAS.

DESCENSO RECURSIVO (PREDICTIVO RECURSIVO)


Es la tcnica ms sencilla que existe para realizar el anlisis sintctico, sin embargo requiere demasiada programacin (genera muchas lneas de cdigo). Adems es el nico mtodo que permite realizar el anlisis sintctico a partir de la definicin directa de los diagramas de sintaxis que representan a un lenguaje; ya que todas las dems requieren la gramtica formal. Esta tcnica consiste en : - Implementar una rutina (mtodo funcin) para cada smbolo No-Terminal (var. sintctica) que se tenga en los diagramas de sintaxis. Esta rutina debe considerar todas las posibles variantes (caminos) definidas para esa variable sintctica en particular. - Programar un estatuto condicional (IF-THEN_ELSE) para cada uno de los smbolos que aparezcan en los diagramas. El anlisis comienza en el diagrama principal del lenguaje y va solicitando tokens al lxico conforme 'acepta' el token que actualmente analiza. Si el token que enva lxico no era el esperado por la sintaxis se generar un error del tipo "Esperaba : _____ "

MTODO PREDICTIVO (PREDICTIVO NO-RECURSIVO)


Para poder llevar a cabo el anlisis sintctico utilizando la tcnica predictiva no recursiva es necesario que se haya eliminado la recursividad izquierda y los trminos comunes izquierdos de la gramtica del lenguaje que ser analizado sintacticamente (Esta ambigedad no es soportada por las metodologas Top-Down). MODELO DE UN ANALIZADOR PREDICTIVO NO RECURSIVO. Es posible tener un "parser" predictivo teniendo un "stack" explcitamente, para simular el proceso de las llamadas recursivas. El parser decide la produccin que se utilizar en la derivacin slo en base al "token" actual y al smbolo no terminal X que est en el top del "stack" en ese instante.
ANALIZADOR DE LEXICO

PROGRAMA PREDICTIVO NO RECURSIVO

SALIDA

STACK

TABLA PREDICTIVA M

Ing. Elda G. Quiroga

TRADUCTORES

24

El STACK tendr una secuencia de smbolos de la gramtica y un $ en el fondo del "stack". La TABLA PREDICTIVA es un arreglo de dos dimensiones M[X,a], donde X es un smbolo no terminal, y a es smbolo terminal o el smbolo $ que es enviado por el lxico indicando fin de archivo.

Algoritmo de Manejo de la Matriz PREDICTIVA (DRIVER) :


Entrada : Un archivo a analizar Salida : Mensaje con : Entrada Aceptada Entrada Errnea. Proceso: Inicio Repetir lo siguiente: Sea X el smbolo que est en el tope de la pila y Nexttoken = el smbolo de entrada actual. Si X es elemento del Conjunto de Terminales entonces: Si X = Nexttoken = $ entonces: Acepta el string de entrada Si no entonces: Si X = Nexttoken y <> $ entonces: Sacar a X de la pila y remover a Nexttoken de la entrada (*es un smbolo vlido*) Si no entonces: ERROR (*Esperaba X *) Si no entonces : (* X es elemento de los No-Terminales *) Si M [ X, nexttoken ] = X Y1 Y2 Y3 ..... Yn entonces: Sacar a X de la pila. Meter a la pila Yn .... Y3 Y2 Y1 (* quedando Y1 en el TOP de la pila *) Si no entonces: (* casilla vaca *) ERROR (* Se esperaba alguno de los First de X *) Hasta que Nexttoken = $ y la Pila est vaca. Fin

Algoritmo de Construccin de la Matriz PREDICTIVA


Entrada : Una gramtica G. Salida : La matriz predictiva correspondiente a dicha gramtica. Proceso : Inicio Para cada produccin A de la gramtica G hacer Para cada smbolo terminal a en los FIRST() hacer Aadir A en M[A,a]. Si existe el smbolo dentro de los FIRST() Para cada terminal b (b <> $) en el conjunto de FOLLOW(A) hacer Aadir A en M[A,b] Si est en los FIRST() y el smbolo $ est en los FOLLOW(A) Aadir A en M[A,$]. Para cada casilla que qued vaca en la matriz hacer ERROR (* Smbolo invlido para esa produccin *) Fin.

Ing. Elda G. Quiroga

TRADUCTORES

25

MTODOS BOTTOM-UP
Estas metodologas tratan de encontrar el rbol con la derivacin de ms a la derecha en reversa para un string de entrada. Son tcnicas REDUCCIONISTAS.

Algoritmo para el manejo de la MATRIZ generada por cualquiera de los MTODOS LR


FUNCIONAMIENTO DEL ANALIZADOR L.R. : 1. Suposiciones:
La variable Nexttoken se usar para almacenar el smbolo de la entrada que se est analizando. La variable TAccin se utilizar para almacenar la Tabla de Acciones. La variable TGoto se utilizar para almacenar la Tabla de Brincos. Existe un OBSERVA que regresa lo que est almacenado en el tope de la pila sin sacarlo.

2. Inicializacin:
Se tiene un string de entrada con el smbolo $ (fin de entrada concatenado al final). Nexttoken := Primer smbolo de la entrada. Hacer que la pila est vaca. Insertar en la Pila un 0 { Inicialmente el analizador est en el estado 0 } TAccin := contenido de la tabla de acciones. TGoto := contenido de la tabla de brincos.

3. Algoritmo : REPETIR, HASTA QUE SE ACEPTE O MARQUE ERROR, LO SIGUIENTE: Nexttoken contiene el elemento actual a analizar. Observa (Sm ) /* Sm contiene el estado actual del DFA */ Accin := TAccin [Sm , Nexttoken]. SI (Accin = ACC) ENTONCES: Aceptar el string de entrada. Terminar el anlisis. SI (Accin = ERR) ENTONCES: Existe un error en la entrada. Llamar a la rutina de manejo de errores. SI (Accin = sN) ENTONCES: Insertar Nexttoken en la Pila. Insertar N en la Pila. /*N es el nuevo estado del DFA */ Actualizar el valor de Nexttoken (obtener el siguiente). SI (Accin = rM) ENTONCES: Sea (A ) la produccin nmero M de la gramtica. Sacar (2 * | | ) smbolos de la Pila. (| | = longitud de ) Observa(S m ) /* el elemento que ahora est en el tope de la pila*/ Insertar a A en la pila. Insertar en la pila K /* K es el # de estado almacenado en TGoto[Sm , A] */

Ing. Elda G. Quiroga

TRADUCTORES

26

LR Simple (SLR) CONSTRUCCION DE LA MATRIZ SLR


Definiciones necesarias para la construccin de la matriz SLR: La idea central del mtodo SLR es construir un DFA a partir de la gramtica y llenar una Matriz. 1. Elementos SLR (ITEM) Un ITEM SLR es una produccin de la gramtica con un apuntador en alguna parte de su lado derecho. Esto es un ITEM SLR es de la forma A . Por ejemplo, de la produccin A XY se pueden generar los siguientes ITEMS : A XY A X Y A XY De la produccin A slo puede generarse un item A . Un ITEM SLR indica hasta qu punto de la produccin se ha "aceptado" en cierto momento del proceso de anlisis. 2. Estados SLR. Un estado SLR es un conjunto de ITEMS SLR. Por ejemplo un posible estado SLR podra ser : {AaBd , Bd , B }. Un estado SLR se representa como : Ii. Para construir la matriz SLR se requiere utilizar una GRAMATICA AUMENTADA (G') y 2 funciones CERRADURA (closure) y GOTO. 3. Gramtica Aumentada ( G' ). Se le da el nombre de gramtica aumentada a la gramtica G que tiene un nuevo smbolo inicial (G') y una produccin adicional G ' G . Este nuevo smbolo inicial sirve para indicarle al analizador cuando debe detenerse y aceptar la entrada. Este significa que un string de entrada es aceptado nicamente cuando el analizador reduce la produccin G'G . Definicin formal: Sea G = { N, T, P, S } la gramtica a la cual se le desea construir un analizador SLR, entonces se ' } donde N' = N U {S'' } y P' = P U { S'' S}. debe disear la gramtica G' = { N' , T, P' , S' 4. Funcin Cerradura. Si I es un conjunto de ITEMS de la gramtica G, entonces la cerradura ( I ), es el conjunto de items construdo a partir de I utilizando las siguientes reglas: 1). Todos los ITEMS en I se aaden a la cerradura (I). 2). Si A B est en la cerradura (I) y B es una produccin , entonces aadir el ITEM B a I, si todava no est ah. Esta regla se aplica hasta que no puedan aadirse ms ITEMS a la cerradura(I). 5. Operacin GOTO(I , X). La cerradura del conjunto de todos los ITEMS AX tal que A X est en I es un conjunto de ITEMS y X es un smbolo gramatical(Terminal No-Terminal).

I. Donde

Ing. Elda G. Quiroga

TRADUCTORES

27

CONSTRUCCION DEL CONJUNTO DE ESTADOS SLR.


El algoritmo que se requiere para la construccin del conjunto de estados para el analizador SLR utilizando una gramtica aumentada (G') quedara como: PROCEDURE ITEMS(G'); BEGIN C := { CERRADURA( {S' S} ) }; REPETIR Para cada conjunto de ITEMS I en C y para cada smbolo gramatical X tal que GOTO (I,X) exista (no est vaco) y no est en C hacer Aadir GOTO (I,X) a C. HASTA que no se puedan aadir ms conjuntos de ITEMS a C. END. Una vez que se tienen todos los estados (del DFA), se puede definir el algoritmo que sirve para la construccin de las tablas de ACCION y BRINCO de la matriz SLR. Para esto se requiere conocer los FOLLOW(A) para cada smbolo No-Terminal A de la gramtica.

ALGORITMO PARA LA CONSTRUCCION DE LA MATRIZ S.L.R.


Entrada: Una gramtica aumentada G' Salida: Las tablas de ACCION y BRINCO de la matriz SLR. Proceso: 1. Construir el conjunto de estados SLR para G' C = { Io, 2. El estado

de la tabla se construye a partir de

, entonces aadir shift j a la tabla de accin en ACCION [i, a]. Esto ocurre s y slo si, a es un smbolo terminal. b). Si A est en Ii , entonces aadir reduce A en la tabla de accin en ACCION [i,a] para todos los smbolos terminales del FOLLOW(A), excepto para cuando A = S'. c). Si S'S est en Ii , entonces aadir ACC en la tabla de accin en ACCION[ i,$] 3. Las transiciones GOTO para el estado i se construyen para todos los smbolos NoTerminales A utilizando la siguiente regla: Si GOTO(Ii , A) =Ij , entonces aadir j en la tabla de goto en GOTO[i, A]. 4. Todas las casillas que hayan quedado sin definir representan un estado de error. 5. El estado inicial del analizador es quel construido a partir de S' S. NOTA: Puede darse el caso de una casilla que contenga simultaneamente un Shift y un Reduce (Porque la gramtica no sea estrictamente SLR). Cuando esto suceda se deber elegir la accin de Shift y desechar la de Reduce.

estado i se determinan como sigue: a). Si Aa est en Ii y GOTO(Ii , a) =

Ii

I1, I2, In }

. Las acciones correspondientes al

Ij

Ing. Elda G. Quiroga

TRADUCTORES

28

L.R. CANNICO
1. Elementos LR(1) (ITEM) Un ITEM LR(1) es una produccin de la gramtica con un apuntador en alguna parte de su lado derecho y con un terminal(es) (lookahead) asociado a l. Esto es un ITEM LR(1) es de la forma A , a. Donde A es una produccin de la gramtica y a es un smbolo terminal el smbolo $. En los ITEMs LR(1), el 1 se refiere a la longitud del segundo componente (a) que es el lookahead. Este lookahead no tiene ningn efecto en ITEMS de la forma A , a ; donde <>, pero en ITEMS de la forma A , a ; significa reducir la produccin A si el siguiente smbolo de entrada es a. 2. Estado LR(1) es un conjunto de ITEMS LR(1). Un estado LR(1) se representa como : Ii. 3. Gramtica Aumentada ( G' ) se maneja el mismo concepto que en el SLR. 4. Funcin Cerradura. La funcin de cerradura para el mtodo LR Cannico, se define como:
FUNCTION CERRADURA (I ); REPETIR Para cada ITEM [A B , a] en I , Para cada produccin B Para cada terminal b en FIRST( a) tal que [ Aadir [ B , b ] a I HASTA que no se puedan aadir ms items a I .

B , b ] no est en I hacer

5. Operacin GOTO(I , X). La operacin se define como:

FUNCTION GOTO (I , X); Sea J el conjunto de ITEMS [AX , a] tal que [A X , a] est en GOTO := CERRADURA ( J );

I hacer

6. CONSTRUCCION DEL CONJUNTO DE ESTADOS LR(1).


PROCEDURE ITEMS(G'); C := { CERRADURA( {S' S , $} ) }; REPETIR Para cada conjunto de ITEMS I en C y para c/ smbolo gramatical X tal que GOTO ( I , X ) exista (no est vaco) y no est en C hacer Aadir GOTO (I ,X) a C. HASTA que no se puedan aadir ms conjuntos de ITEMS a C.

7. CONSTRUCCION DE LA MATRIZ L.R. CANONICA Se utiliza el mismo algoritmo que en el mtodo SLR, la nica diferencia es al momento de colocar las REDUCCIONES, ya que slo se colocarn en el (los) look-aheads que tenga asociados la produccin.

Ing. Elda G. Quiroga

TRADUCTORES

29

L.A.L.R.
El mtodo LALR (lookahead-LR) es la tcnica bottom-up ms comnmente utilizada, debido a que el tamao de la matriz que se genera es, generalmente, bastante ms pequa que la que se obtiene del mtodo LR Cannico. Adicionalmente se sabe que este mtodo funciona para la mayora de las construcciones sintcticas. Para construir la matriz LALR: 1 2 Se obtienen todos los estados por el mtodo LR Cannico. Se mezclan aquellos estados que tengan la misma "cerradura" pero diferentes lookaheads. De esto se obtiene un estado con esa cerradura y con la unin de los lookaheads involucrados. Al final, se construye la matriz LALR usando el mismo algoritmo que se emple para el LR Cannico.

Ing. Elda G. Quiroga

TRADUCTORES

30

ANLISIS SEMNTICO Y GENERACIN DE CDIGO INTERMEDIO


ANLISIS SEMNTICO.
El anlisis de semntica en el rea de lenguajes de programacin incluye algunas verificaciones tales como: Existencia y Unicidad de Variables, Compatibilidad de Tipos de Datos, Congruencia en cantidad de parmetros, etc. Este parte del anlisis se lleva a cabo, no como una etapa independiente del proceso de traduccin, sino como reglas que se distribuyen a lo largo del proceso de traduccin. Algunas tcnicas existentes para desarrollar el anlisis semntico se discutirn ms adelante en esta gua.

GENERACIN DE CDIGO INTERMEDIO


El tema principal de esta gua es la fase de generacin de cdigo intermedio. Como ya se sabe, el cdigo intermedio forma un lenguaje de bajo nivel, sin llegar al nivel ms primitivo.

Tipos de Cdigo Intermedio


Existen diversos formatos para representar las instrucciones en cdigo intermedio. Se presentarn para mostrar las alternativas que existen, pero el disear o elegir un formato de cdigo intermedio ser trabajo del programador del traductor. En los ejemplos que aparecern, se ha dejado el identificador (nombre) de la variable, pero lo que realmente debe aparecer es la direccin generada por el anlisis de lxico, ya que uno de los objetivos de esa fase es precisamente asociar una direccion nica a cada una de las variables.

Notacin Polaca
Este tipo de cdigo intermedio sirve para pasar de una notacin de infijo a una notacin de postfijo. A continuacin se mostrar un ejemplo de este tipo de traduccin : A := B + C * D Esta instruccin convertida a notacin polaca queda : A B C D * + := Esta notacin resuelve el orden en que se deben de ejecutar las operaciones de acuerdo a la prioridad de los operadores. Para ejecutar este tipo de cdigo se requiere del uso de una pila de ejecucin, cuyo algoritmo es el siguiente : i=1 REPETIR SI vector_polaco [ i ] = variable ENTONCES PUSH pila_de_ejecucin(variable) SI NO SI vector_polaco [ i ] = operador ENTONCES POP pila_de_ejecucin elemento_1 POP pila_de_ejecucin elemento_2 PUSH pila_de_ejecucin(elemento_1 operador elemento_2) SI NO ..............(*diversas operaciones, ajenas a expresiones*) i=i+1 HASTA fin de vector_polaco

Ing. Elda G. Quiroga

TRADUCTORES

31

Triplos
Este tipo de cdigo utiliza instrucciones con un formato de tres campos
Cdigo de Operacin Operando1 Operando2

A continuacin se mostrar un ejemplo de este tipo de traduccin : A := B + C * D Esta instruccin convertida a triplos queda : * C D + B := A La ejecucin de los triplos tambin requiere de una pila. El algoritmo para ejecutar triplos es : PARA cada triplo HACER SI est explcito el operando_1 y el operando_2 ENTONCES PUSH pila_de_ejecucin (operando_1 operador operando_2) SI slo est explcito el operando_1 ENTONCES PUSH pila_de_ejecucin (POP pila_de_ejecucin operador operando_1 ) ........... (*diversas operaciones*) SI no est explcito ningn operando ENTONCES PUSH pila_de_ejecucin (POP pila_de_ejecucin operador POP pila_de_ejecucin )

Cudruplos
Este tipo de cdigo utiliza instrucciones con un formato de cuatro campos
Cdigo de Operacin Operando1 Operando2 Resultado

A continuacin se mostrar un ejemplo de este tipo de traduccin : A := B + C * D Esta instruccin convertida a cudruplos queda : * C D + B T1 := T2

T1 T2 A

Donde T1 y T2 son direcciones temporales, seleccionadas por el traductor; aunque para generar este tipo de cdigo el traductor debe efectuar ms procesamiento, el ejecutador se ve beneficiado porque el algoritmo de ejecucin queda muy simple, y se muestra a continuacin: PARA cada cudruplo HACER SI el operador es binario ENTONCES Resultado := operando1 operador operando2 ...... (*diversas operaciones*)

Ing. Elda G. Quiroga

TRADUCTORES

32

Cdigo P
La mquina P es una mquina emulada por Software ideada por Niklaus Wirth (creador del Pascal) y preparada para ejecutar cdigo P. El cdigo P requiere para su ejecucin de una pila, las instrucciones en P hacen referencia a esta pila. El haber diseado esta mquina y el haber pensado en que el Pascal se tradujera a este tipo de cdigo permiti acortar considerablemente el tiempo de desarrollo de este traductor, y lo convirti en un traductor transportable pero con la desventaja que queda lenta la ejecucin de un programa traducido de esta manera. El formato de las instrucciones en P es el siguiente: Cdigo de Operacin Operando

Si se omite el operando, el cdigo de operacin hace referencia al top y al top-1 de la pila de ejecucin. A continuacin se mostrar un ejemplo de este tipo de traduccin : A := B + C * D Esta instruccin convertida a cdigo P queda :
Carga B Carga C Carga D Multiplica Suma Almacena A

En este ejemplo se utilizaron cdigos de operacin generales, pero realmente en cdigo P existen cdigos especiales para hacer referencias a variables locales o globales.

Comparacin de los diversos mtodos expuestos


En cuanto a la cantidad de memoria que requieren para su almacenamiento, podramos ordenarlos de menor a mayor de la siguiente manera:
- Notacin polaca - Cdigo P - Triplos - Cudruplos

En cuanto a velocidad de su ejecucin, podramos ordenarlos de menor a mayor como sigue:


- Cudruplos - Triplos, Cdigo P - Notacin polaca

Si lo que se desea es convertir el cdigo intermedio a cdigo objeto, ordenando de menor a mayor grado de complejidad quedara:
- Cudruplos - Triplos, Cdigo P - Notacin polaca

Se debe efectuar la decisin sobre el tipo de cdigo que conviene generar, o si requiere disear un nuevo tipo de formato que cubra sus necesidades de traduccin.

Ing. Elda G. Quiroga

TRADUCTORES

33

Una gran ventaja de los mtodos que vamos a estudiar para generar cdigo intermedio, es que su implementacin podr ser modular, entonces, aunque todava no se entienda el mtodo completo, podr comenzarse diseando un primer mdulo que podra ser el de expresiones aritmticas.

Generacin de Cdigo Intermedio para expresiones aritmticas


Diagrama de Sintaxis para las Expresiones
Aunque sintcticamente, es totalmente equivalente colocar todos los operadores en un mismo nivel o jerarqua, dado que la generacin de cdigo intermedio ser controlada por el anlisis sintctico, entonces nos convendr separar los diagramas, y asimismo la gramtica, por prioridad de los operadores. En Pascal no se hace distincin entre las expresiones aritmticas o booleanas, todas pertenecen a la clase EXPRESION, pero nosotros tomaremos primeramente un subconjunto de las expresiones que slo contenga a algunos de los operadores aritmticos. A continuacin se muestra el subconjunto de las expresiones que utilizaremos para disear sus acciones de generacin de cdigo.
<E> T <T> F *

+
<F> id

Evaluacin de una expresin


Una expresin puede ser evaluada de derecha a izquierda, o de izquierda a derecha, a esto se le llama asociatividad derecha e izquierda, respectivamente. Asociatividad derecha Usando asociatividad derecha la evaluacin de la siguiente expresin mostrada a continuacin se realizara de la siguiente manera: 3+2+5 3+ 7 10 Este tipo de asociatividad no es vlida ni para resta ni para la divisin. Asociatividad izquierda Usando asociatividad izquierda la evaluacin de la siguiente expresin mostrada a continuacin se realizara de la siguiente manera: 3+2+5 5 + 5 10 Este tipo de asociatividad es vlida para todas las operaciones.

Ing. Elda G. Quiroga

TRADUCTORES

34

Generacin de Notacin Polaca para asociatividad derecha


Mostraremos las acciones de generacin de cdigo directamente sobre los diagramas de sintaxis, pensando en que ser muy sencillo reconocer su localizacin sobre el programa de anlisis sintctico. Para generar cdigo en notacin polaca, al que llamaremos vector polaco requeriremos: - Pila de Operadores - Vector para almacenar el cdigo Se podr observar lo sencillo que es introducir las acciones al diagrama de sintaxis, y se podr notar que de esta manera se automatizar el proceso de traduccin de las expresiones. Acciones de generacin de cdigo
<E> T 4 <T> F * 1 3 id 5

+
<F> 2

(
6

)
7

Escribir en el vector polaco, la direccin de la variable generada por el anlisis de lxico. Push pila-de-operadores(+) Push pila-de-operadores(*) MIENTRAS el top de la pila de operadores contenga un + HACER LO SIGUIENTE: vector polaco (direccin actual) = pop pila-de-operadores 5.- MIENTRAS el top de la pila de operadores contenga un * HACER LO SIGUIENTE: vector polaco (direccin actual) = pop pila-de-operadores 6.- Push pila-de-operadores(marca de fondo falso) 7.- Pop pila-de-operadores.... se quita la marca de fondo falso Para probar este mtodo se recomienda marcar los diagramas y utilizar una pila para seguirlos.

1.2.3.4.-

Generacin de Notacin Polaca para asociatividad izquierda


Como se habr notado en los ejercicios anteriores, la pila de operadores acumular todos los operadores de igual prioridad que aparezcan en la expresin a traducir; para asociatividad izquierda a lo ms se requerir acumular un operador. Las acciones de generacin de cdigo quedan muy similares, slamente se debe mover de posicin a la accin 4 y a la accin 5.

Ing. Elda G. Quiroga

TRADUCTORES

35

Acciones de generacin de cdigo


<E> T 4 <T> F * 1 3 id 5

+
2 <F>

(
6

)
7

Escribir en el vector polaco, la direccin de la variable generada por el lxico. Push pila-de-operadores(+) Push pila-de-operadores(*) SI el top de la pila de operadores = + ENTONCES vector polaco (direccin actual) = pop pila-de-operadores 5.- SI el top de la pila de operadores = * ENTONCES vector polaco (direccin actual) = pop pila-de-operadores 6.- Push pila-de-operadores (marca de fondo falso) 7.- Pop pila-de-operadores.... se quita la marca de fondo falso Cabe hacer notar que por el momento se est asumiendo que todas las variables son globales,

1.2.3.4.-

Acciones de generacin de cdigo en la gramtica


Si convertimos directamente los diagramas de sintaxis del subconjunto de expresiones aritmticas a una gramtica, podramos obtener: E T + E ET T F*T T F F id F ( E ) Si el mtodo de reconocimiento sintctico que vamos a seguir es un mtodo top-down, entonces la gramtica se deber transformar, y quedara de la siguiente manera: E TE' E' + T E' E' T FT' T' *F T' T' F id F(E) Colocando las acciones de generaccin de cdigo sobre esta gramtica obtenemos para:

Ing. Elda G. Quiroga

TRADUCTORES

36

Asociatividad izquierda E TE' E' + {accin2} T {accin4} E' E' T FT' T' * {accin3} F {accin5} T' T' F id {accin1} F ({accin6} E ) {accin7} 1.2.3.4.Escribir en el vector polaco, la direccin de la variable generada por el anlisis de lxico. Push pila-de-operadores(+) Push pila-de-operadores(*) SI el top de la pila de operadores = + ENTONCES vector polaco (direccin actual) = pop pila-de-operadores 5.- SI el top de la pila de operadores = * ENTONCES vector polaco (direccin actual) = pop pila-de-operadores 6.- Push pila-de-operadores (marca de fondo falso) 7.- Pop pila-de-operadores.... se quita la marca de fondo falso

Generacin de cudruplos.
A partir de este momento, slo consideraremos a la asociatividad izquierda, ya que es la nica vlida para todas las operaciones. Para generar cudruplos requeriremos: - Pila de operadores - Pila de operandos - Avail de direcciones temporales - Espacio para almacenar los cudruplos generados

Como las acciones no cambian colocndolas en los diagramas de sintaxis o en la gramtica, de aqu en adelante slo las colocaremos en los diagramas de sintaxis.

ACCIONES DE GENERACIN DE CDIGO PARA EXPRESIONES COMPLETAS, INCLUYENDO OPERADORES BOOLEANOS


Para que los diagramas de expresiones queden completos, slo nos falta aadir a los operadores booleanos, las acciones no sufren cambios, slo faltan las de los operadores relacionales. Mostraremos de nuevo un subconjunto de las expresiones, tomando algn operador ejemplo para cada nivel de prioridad.

Ing. Elda G. Quiroga

TRADUCTORES

37

8 <E> ES
op.rel

9 ES

< ES > T

<T> F *
and

+
or

2 <F> id 1

(
6

)
7

1.2.3.4.-

5.6.7.8.9.-

Push pila-de-operandos(direccin de la variable) Push pila-de-operadores(operador) Push pila-de-operadores(operador) SI el top de la pila de operadores = +, or ENTONCES Generar cudruplo: operador operando1 operando2 Resultado donde, operando2 = Pop pila-de-operandos operando1 = Pop pila-de-operandos Resultado = Temporal obtenido del avail SI alguno de los operandos corresponda a un temporal ENTONCES Regresarlo al avail Push pila-de-operandos(Resultado) Pop pila-de-operadores. SI el top de la pila de operadores = *,and ENTONCES ** igual a accin 4 Push pila-de-operadores (marca de fondo falso) Pop pila-de-operadores.... se quita la marca de fondo falso Push pila-de-operadores (operador) Generar cudruplo: operador operando1 operando2 Resultado donde, operando2 = Pop pila-de-operandos operando1 = Pop pila-de-operandos Resultado = Temporal obtenido del avail SI alguno de los operandos corresponda a un temporal ENTONCES Regresarlo al avail Push pila-de-operandos(Resultado) Pop pila-de-operadores.

Como se habr notado, los diagramas mostrados permiten algunas secuencias que sern imposibles de evaluar, y adems, en aqullas que tienen posibilidad de evaluarse, se requiere de una combinacin especfica de tipos para las variables. Por lo tanto las expresiones requieren de un anlisis semntico tema que ser tratado en la siguiente seccin.

Ing. Elda G. Quiroga

TRADUCTORES

38

ANLISIS SEMNTICO
Para efectuar el anlisis semntico de una expresin se revisar la combinacin de tipos a los que pertenezcan las variables y constantes que acten como operandos. Para incluir los tipos (simples, ms tarde revisaremos los dimensionados) de las variables en la tabla de smbolos podemos efectuar las siguientes acciones:
<V> id 1 2 TIPO

1.-Push pila-de-operandos (direccin de la variable) 2.-Poner el tipo a todas las variables que se metieron a la pila de operandos, y sacarlas de la pila.

Reglas semnticas Utilizaremos como referencia las reglas semnticas de las expresiones en Pascal, para esto construiremos una tabla donde E = entero R = real C = caracter S = string B = booleano X = ERROR SEMANTICO
op1 E E R R C C S S B op2 E R E R C S C S B *,+,E R R R X X X X X / R R R R X X X X X div mod E X X X X X X X X relac B B B B B B B B B and or X X X X X X X X B

En esta tabla se omitieron un conjunto de combinaciones que con cualquier operacin producer error, como por ejemplo ENTERO con STRING. Ya que un traductor es una autmata (con funcionamiento automtico), es conveniente que el anlisis semntico tambin se automatice. Las claves para automatizar el anlisis semntico son: - Utilizar acciones para la verificacin semntica - Escoger una estructura de datos que permita accesarla directamente, encontrar el resultado de una operacin y descubrir si sta es o no vlida. De hecho estas claves estn vigentes para todo el proceso de traduccin, en cuanto a utilizar acciones y estructuras de datos automticas. Para el anlisis semntico no se recomienda usar la tabla mostrada anteriormente, debido a que su acceso no es automtico y le faltan muchas combinaciones.

Ing. Elda G. Quiroga

TRADUCTORES

39

ACCIONES PARA VERIFICACIN SEMNTICA


Para mostrar un ejemplo de como disear las acciones de verificacin semntica, utilizaremos un subconjunto de expresiones aritmticas. Estas acciones se debern de aadir a las acciones de generacin de cdigo, y no modifican nada de lo ya visto en generacin de cdigo. Para realizar la verificacin semntica se requerir de una pila de tipos.
<E> T 4 <T> F * 1 3 id 5

+
2 <F>

(
6

)
7

1.2, 3 4.-

5.6, 7

Push pila-de-tipos (tipo de la variable) No llevan accin semntica SI tipos del top y top-1 de la pila de tipos son permitidos en la operacin a generar ENTONCES Pop pila-de-tipos; Pop pila-de-tipos Push pila-de-tipos (resultado de la operacin) SI NO Marcar error semntico, y aplicar accin correctiva que podra ser: Pop pila-de-tipos; Pop pila-de-tipos Push pila-de-tipos (posible resultado de la operacin) Igual a 4. No llevan accin semntica

Ing. Elda G. Quiroga

TRADUCTORES

40

GENERACIN DE CDIGO PARA

ESTATUTOS
ESTATUTOS CONDICIONALES
Para los estatutos que traduciremos a partir de esta seccin, se requerir de una nueva pila, la pila de saltos, adems introduciremos una nueva instruccin en cdigo intermedio, la instruccin goto que aparecer en varias modalidades: goto gotofalso operando gotoverdadero operando
(* incondicional *) (* que efecta un salto si el operando tiene un valor de falso*) (* que efecta un salto si el operando tiene un valor de verdadero*)

Generalmente, al generar un goto, an no sabemos a qu direccin saltar, entonces quedar pendiente por rellenar; para efectuar esta funcin utilizaremos al procedimiento: rellenar(direccin a rellenar, valor con que se rellena) Adems utilizaremos un contador que llamaremos cont que contendr la direccin del siguiente cudruplo a generar, al inicio de la generacin de cdigo, cont tendr un valor de 1.

Estatuto IF-THEN
1 <S>
IF

2
THEN

1.-

2.-

aux = POP PTipos SI aux diferente de booleano ENTONCES error semntico. sino Sacar resultado de PilaO Generar gotofalso resultado ______ PUSH PSaltos (cont-1) Sacar fin de PSaltos rellenar (fin, cont)

Ing. Elda G. Quiroga

TRADUCTORES

41

Estatuto IF-THEN-ELSE
<S>
IF

1 E
THEN

2 S
ELSE

3 S

1.- aux = POP pila-de-tipos SI aux diferente de booleano ENTONCES error semntico. Sino Sacar resultado de pila-de-operandos Generar gotofalso resultado ______ PUSH pila-de-saltos (cont) 2.- Generar goto _______ sacar falso de pila-de-saltos rellenar (rellenar falso, cont) PUSH pila-de-saltos (cont - 1) 3.- Sacar fin de pila-de-saltos rellenar (fin, cont) NOTA: Para efectos prcticos:
pila-de-operandos = PilaO pila-de-operadores = Poper pila-de-saltos = Psaltos pila-de-tipos = PTipos

Estatuto CASE
1 <ESTAT> CASE EXP 2 <OPCION> EXP_ORDINAL .. , 3 EXP_ORDINAL 4 6 of OPCION : ESTAT ELSE 5 6 ESTAT END 7

1.2.-

3.-

Verificar que el tipo de la expresin sea Ordinal (entero, char, bool, ...) Meter una marca de fondo falso en la PilaSaltos. Verificar que la expresin ORDINAL (que debe ser un dato simple) tenga el mismo tipo que EXP (el tope actual de la PilaO. Cte = Pop de la PilaO, Exp= Pop de la PilaO Generar el cudruplo : = , Exp, Cte, Tk Generar el cudruplo : GotoV, Tk, ____ Sacar el temporal Tk de la PilaO. Meter nuevamente Exp a la PilaO Meter CONT-1 en la PilaSaltos. Verificar que la expresin ORDINAL (que debe ser un dato simple) tenga el mismo tipo que EXP (el tope actual de la PilaO. Cte = Pop de la PilaO, Exp= Pop de la PilaO

Ing. Elda G. Quiroga

TRADUCTORES

42

4.-

5.-

6.7.-

Meter nuevamente Exp a la PilaO Generar el cudruplo : >= , Exp, Cte, Tk Verificar que la expresin ORDINAL (que debe ser un dato simple) tenga el mismo tipo que EXP (el tope actual de la PilaO. Cte = Pop de la PilaO, Exp= Pop de la PilaO Generar el cudruplo : <= , Exp, Cte, Tj Sacar el temporal Tj de la PilaO. Sacar el temporal Tk de la PilaO Generar el cudruplo : AND, Tj, Tk, Tn Generar el cudruplo : GotoV, Tn, ____ Meter CONT-1 en la PilaSaltos. Mientras no se encuentre la marca de fondo falso de PilaSaltos, sacar y: Rellenar todos los GotoV con CONT+1 Generar un Goto, ____ Guardar CONT-1 en la PilaSaltos. Rellenar el Goto que est en el tope de la PilaSaltos con CONT+1 Generar un Goto, ____ Guardar CONT-1 en la PilaSaltos. Sacar el tope de la PilaO (es Exp). Mientras existan Goto pendientes en PilaSaltos, Rellenar cada uno con CONT

ESTATUTOS DE REPETICIN
Estatuto WHILE
<S>
WHILE

1 E

2
DO

3 S

Meter cont en PSaltos Sacar aux de PTipos SI aux diferente de booleano ENTONCES error semntico. sino Sacar resultado de PilaO Generar gotofalso resultado ______ PUSH Psaltos (cont-1) 3.- Sacar falso de PSaltos. Sacar retorno de PSaltos Generar goto retorno rellenar (falso, cont)

1.2.-

Ing. Elda G. Quiroga

TRADUCTORES

43

Estatuto REPEAT
<S>
REPEAT

,
S
UNTIL

E
2

1.- PUSH pila-de-saltos (cont) 2.- Generar gotofalso POP pila-de-operandos POP pila-de-saltos

Estatuto FOR
<For> FOR Id 1 := Exp 2 TO Exp 3 D O S 4

1.2.3.-

4.-

Guardar el identificador (direccin) en pila de Operandos (PilaO), verificar semntica. Exp1 = Pop de PilaO (es la variable que contiene el "resultado" de la expresin). Id= Tope de la Pila de operandos (PilaO) (sin sacarlo). Generar el cudruplo : (:= , Exp1, , Id) Obtener una variable Temporal (Tf) /* Ver nota */ Exp2= Pop de la PilaO (es la variable que contiene el "resultado" de la expresin2). Obtener otra variable temporal (Tx) Generar los cudruplos: (:= , Exp2, , Tf) (<=, Id , Tf, Tx) /* Sin liberar a Tf */ (Gotof, Tx, ___ ) Liberar la variable temporal Tx. Meter en la PilaSaltos direccin cont-2 (#de cudruplo del <= ) Id = Pop de PilaO Genera cudruplo: (+ , Id , 1 , Id) retorno = Pop de PilaSaltos. Genera cuduplo: (Goto , retorno) Rellena (retorno +1 , Cont) /* Corresponde al GotoF*/ Libera la variable temporal Tf.

NOTA: Se utiliza una variable temporal Tf para dejar el resultado de Exp2, porque si Exp2 fuera una variable simple (ej: N), se podra alterar su valor dentro de algn estatuto del For y pudiera ocasionar problemas. (ej: provocar un ciclo infinito).

Ing. Elda G. Quiroga

TRADUCTORES

44

GENERACIN DE CDIGO PARA VARIABLES DIMENSIONADAS


El lugar de trabajo para las variables simples podr coincidir en la direccin que se les gener en el anlisis de lxico, pero en las variables dimensionadas, se requerir de un mayor espacio de trabajo. Si el lenguaje de programacin lo permite, el usuario podr declarar variables de cualquier dimensin, y es prcticamente imposible que el traductor haya contemplado dentro de su definicin estructuras de datos para aceptar cualquier dimensin de cualquier orden. As que lo que puede hacer el traductor es convertir los arreglos (a traducir) de cualquier dimensin en arreglos de una dimensin. Para esto hay varios procedimientos, el que utilizaremos es el siguiente: Dada una declaracin de variable dimensionada id-dim : array [lmite inferior1..lmite superior1, lmite inferior2..lmite superior2, ......... , lmite inferiorn .. lmite superiorn ] of tipo El clculo para una encontrar la direccin en una dimensin se puede realizar como id-dim[s1,s2,...sn] = (s1-lmite inferior1)*d2*d3*....*dn + (s2 - lmite inferior2) *d3*d4*.... * dn + ........... + (sn-1- lmite inferiorn-1) *dn + (sn- lmite inferiorn) + DireccinBASE donde di = lmite superior i - lmite inferior i + 1 Si se generaran todas las operaciones involucradas en la frmula anterior, se requerira de mucho tiempo de ejecucin para encontrar la direccin en una dimensin, as que rearreglaremos esta frmula agrupando todas las constantes que puedan calcularse desde la declaracin de la variable. De esta manera la frmula queda: id-dim[s1,s2,...sn] = s1*m1 + s2*m2 + ........... + sn-1*mn-1 + sn + K + BASE donde m1= d2*d3*....*dn m2= d3*d4*....*dn ........ m n-1= dn K = - (lmite inferior1 * m1 + lmite inferior2 * m2 + .........+ lmite inferiorn) Dejar as la frmula reduce notablemente las operaciones a generar para traducir la referencia de la variable dimensionada, ya que el clculo de las mi y S se efecta slamente en el momento de la declaracin de la variable y no cada vez que se hace referencia a ella.

Ing. Elda G. Quiroga

TRADUCTORES

45

Aunque existen otras alternativas para traducir la referencia de una variable dimensionada, nos concentraremos en sta porque es la que produce menor nmero de operaciones, y por tanto, mayor velocidad de ejecucin. Para efectuar la declaracin de una variable dimensionada, si es que se va a utilizar la frmula reducida, es conveniente almacenar en la misma estructura en la que se va guardar la descripcin de las dimensiones el valor de las constantes m y S. Una posible estructura de datos para efectuar la declaracin y almacenarla en la tabla de smbolos sera: Tabla de smbolos
Nombre Li1 Ls1 m1 Li2 Ls2 m2 ...... Lin Lsn s

Adems se deber almacenar la BASE relacionada con el nombre del id.

Declaracin de VARIABLES DIMENSIONADAS


< DIM >

, id
1.2.3.4.5.6.7.-

, :
ARRAY

CTE

..

CTE

of

TIPO

8.-

Guardar dir de id en PilaO Indicar que las variables son dimensionadas. Obtener un campo para la descripcin de la dimensin. Ligar todos los identificadores de la pila con este campo. DIM = 1, R = 1 Almacenar, en campo de descripcin, la constante en LiDIM. Almacenar, en campo de descripcin, la constante en LsDIM. R = ( LsDIM - LiDIM + 1) * R DIM = DIM + 1 Obtener un nuevo campo para la siguiente descripcin. Ligar el campo anterior con el nuevo campo. Ligar el ltimo campo con nulo. Regresar al primer campo de descripcin DIM = 1, SUMA = 0 , AUX = R REPETIR mDIM = R / ( LsDIM - LiDIM + 1) R = mDIM SUMA = SUMA + LiDIM * mDIM DIM = DIM + 1 (Obtener siguiente dimensin) HASTA que no haya ms dimensiones K = SUMA Almacenar -K **K es la cte. de la frmula REPETIR identificador=pop PilaO Almacenar BASE y tipo en el identificador BASE = BASE + AUX HASTA que PilaO quede vaca.

Ing. Elda G. Quiroga

TRADUCTORES

46

Para traducir la referencia a una variable dimensionada considerando que la declaracin de la variable se efectu bajo el mtodo anterior, podramos definir las siguientes acciones:

Acceso a VARIABLES DIMENSIONADAS


< VARIABLE > id [ , E ]

1.- PUSH PilaO (id) 2.- id = POP PilaO Verificar que id sea una variable dimensionada DIM = 1 PUSH PilaDimensionadas(id, DIM) Obtener primer campo de descripcin de id. PUSH POper (marca de fondo falso) 3.- Generar cudruplo: Verifica tope-PilaO LiDIM LsDIM Nota: no se saca el top de la pila de operandos. SI siguiente apuntador es diferente de nulo ENTONCES aux = POP PilaO T = temporal del avail Generar * aux mDIM T PUSH PilaO (T) SI DIM>1 ENTONCES aux2 = POP PilaO aux1 = POP PilaO T = temporal del avail Generar cudruplo + aux1 aux2 T PUSH PilaO (T) 4.- DIM = DIM + 1 Actualizar DIM en PilaDimensionadas Obtener siguiente campo de descripcin 5.- aux1 = POP PilaO T = temporal del avail Generar cudruplos: + aux1 K T **K es la cte. + T BASE T PUSH PilaO ((T)) (*Para distinguirlo *) POP POper (* eliminar marca *) POP PilaDimensionadas Nota : Se debe aadir la verificacin semntica para reconocer si coincide la cantidad de dimensiones declarada, con la referida.

Ing. Elda G. Quiroga

TRADUCTORES

47

GENERACIN DE CDIGO PARA

MDULOS
Hasta el momento se ha supuesto que los estatutos dentro del programa se presentan estrictamente en forma secuencial y dentro del programa principal. Sabemos que, en lenguajes como Pascal y C, el manejo de Procedimientos y Funciones es esencial para el desarrollo de buenos programas. En buena parte, esto tambin pudiera ser utilizado cuando el lenguaje soporta la definicin de clases y su consecuente llamada a los mtodos de duchas clases. A continuacin se definen las acciones de generacin de cdigo que se deben llevar a cabo para los mdulos. Nuevamente se trabaja con una sintaxis similar a la del lenguaje Pascal, sin embargo esto puede ser extrapolado a cualquier tipo de sintaxis particular.

Acciones para la definicin de un PROCEDIMIENTO


1 <PROC'S> PROCEDURE ID ( , ID : ; TIPO ) VAR BLOQUE ; 2 3 4 5 6 7

1.- Dar de alta al nombre del proc. en el Directorio del Procedimientos, verificar su semntica. 2.- Ligar cada parmetro a la tabla de parmetros del directorio de Proc's. 3.- Dar de alta el tipo de los parmetros. 4.- Dar de alta, en el Dir. de Proc's, el nmero de parmetros declarados. 5.- Dar de alta, en el Dir. de Proc's, el nmero de variables locales definidas. 6.- Dar de alta, en el Dir. de Proc's, el nmero de cudruplo (CONT) en el que inicia el procedimiento. 7.- Liberar la tabla de variables locales del procedimiento. Generar una accin de RETORNO.

Ing. Elda G. Quiroga

TRADUCTORES

48

Acciones para la llamada a un PROCEDIMIENTO


4 1 <ESTATUTO> ID ( 2 , 3 5 6

EXP

1.- Verificar que el procedimiento exista como tal en el Dir. de Proc's. 2.- Generar accin: ERA tamao (expansin del registro de activacin, segn # de variables). Inicializar contador de parmetros (k) en 1. Apuntar al primer parmetro, dentro de la tabla de parmetros de ese procedimiento. 3.- Argumento = Pop de PilaOperandos, TipoArg = Pop de PilaTipos. Verificar el tipo del argumento contra el del parmetro k. Generar PARAMETRO, Argumento, Parmetro k (*Se suponen Parmetros por Valor *) 4.- K = K + 1, apuntar al siguiente parmetro. 5.- Verificar que el ltimo parmetro apunte a Nulo. (para congruencia en # de parmetros). 6.- Generar GOSUB, nombre-proc, dir. de inicio .

Acciones para FUNCIONES y PARMETROS POR REFERENCIA.


Es responsabilidad del usuario extrapolar lo hecho para procedimientos, de tal forma que se pueda generar cdigo para Funciones. Adems, es responsabilidad del usuario disear las acciones de cdigo necesarias para soportar Parmetros por Referencia.

EJECUCIN DE ALGUNOS CDIGOS DE OPERACIN ESPECIALES PARA MDULOS.


ERA tamao : Salvar la base local actual (previa a la llamada). Actualizar la base local. Generar el espacio de trabajo para las variables locales y los parmetros del procedimiento. GOSUB nombre-proc, dir. de inicio : Meter la direccin de retorno en la pila de ejecucin. Transferir el control de ejecucin a la direccin de inicio del procedimiento. RETORNO : Actualizar base local (previa a la llamada). Destruir el registro de activacin del proc. Recuperar la direccin de retorno y transferir el control de ejecucin.

Ing. Elda G. Quiroga

TRADUCTORES

49

ADMINISTRACIN DE LA MEMORIA
ADMINISTRACIN DE LA MEMORIA AL MOMENTO DE GENERAR CDIGO INTERMEDIO.
a) Buffer finito. Ocupar un buffer que se llene y si el programa requiere mas espacio marcar error "Programa demasiado largo" . desventaja: No es posible compilar programas muy largos. Paginacin. Utilizar un buffer al que llamaremos pgina y si se nos termina lo vaciamos en el archivo de cdigo, y de nuevo ocupamos el buffer desde el inicio. - Usando esta estrategia es posible compilar programas de longitud infinita. - Desventaja: Es posible que en un momento se ejecute una accin de rellenar un cudruplo que podra encontrarse ya en el archivo, as que hay que accesar el cudruplo correspondiente, modificarlo y volverlo a grabar, de esta manera la compilacin se vuelve muy lenta, y tambin se volvera muy lenta la ejecucin de este programa, de esto hablaremos posteriormente. Para esta estrategia, el traductor debe crear un diccionario de pginas que indique en qu parte del archivo qued grabada cada pgina. c) Segmentacin. Dividir el programa en particiones lgicas a las que llamaremos segmentos. Cada particin debe asegurar que no tiene cudruplos incompletos. Se puede utilizar un buffer para almacenar el cdigo de un segmento y al terminar de compilarse un segmento se vaca el buffer al archivo. - Con esta estrategia es posible compilar programas de longitud infinita. - Desventajas: si se graban solo los cudruplos ocupados el proceso de escritura se puede volver muy lento, y si se graba el buffer completo se puede desperdiciar mucho espacio. Si al compilar un segmento se termina el buffer se puede marcar el error "Procedimiento demasiado grande" Para esta estrategia, el traductor debe crear un directorio de segmentos que indique en qu parte del archivo qued grabado cada segmento. d) Segmentacin con paginacin. En esta estrategia el programa se divide en segmentos y el buffer que se utiliza se divide en pginas, de tal modo que al grabarse el cdigo del segmento en el archivo se graba un nmero entero de pginas. - El proceso de escritura en el archivo es ms rpido que en la estrategia anterior, y tambin ser ms rpido el acceso al archivo en ejecucin. - Desventaja: Se puede desperdiciar una fraccin de una pgina. Para esta estrategia, el traductor debe crear un directorio de segmentos que indique en qu parte del archivo qued grabado cada segmento, y cuntas pginas ocupa el segmento.

b)

Ing. Elda G. Quiroga

TRADUCTORES

50

ADMINISTRACIN DE LA MEMORIA AL MOMENTO DE EJECUCIN


A continuacin se mencionan algunas estrategias para cargar un archivo de cdigo intermedio en memoria para su ejecucin. Cada parntesis hace referencia a las estrategias vistas en el tema de "Administracin de la memoria al momento de generar cdigo intermedio". a) Buffer finito. Se carga el archivo completo de cdigo intermedio en un buffer de igual tamao que el que se utiliz en compilacin y se ejecuta el cdigo. Paginacin. Se define un buffer cuyo tamao sea igual a una o mas pginas. A este buffer le llamaremos rea de overlay. Para iniciar la ejecucin del cdigo se deben cargar al menos las pginas que contengan el programa principal (a su inicio si es muy largo). Al grabar el cdigo se debe dejar grabada la informacin del nmero de pgina donde inicia el programa principal. Cada vez que ocurra un salto a un cudruplo que no esta presente en memoria (en el rea de overlay) se deber utilizar alguna frmula para calcular en que pgina se encuentra dicho cudruplo. En ejecucin se deber crear un directorio para llevar el registro de las pginas que se encuentran cargadas en el rea de overlay. Si al cargar una mgina el area de overlay est llena se debera seguir alguna estrategia de desocupacin (como las que vieron en sistemas operativos). La desventaja de este mtodo es que puede ocurrir un gran trfico de pginas que pueder volver muy lenta la ejecucin. c) Segmentacin. Si el programa se dividi en segmentos, el momento de compilacin se debi crear un directorio de segmentos que indique en que lugar del archivo qued grabado cada segmento, as como su tamao. Para cargar el archivo de cdigo para su ejecucin existen dos alternativas. i) que el usuario decida qu procedimientos desea que se encuentren residiendo en todo momento en memoria principal y cuales trafiquen en una area overlay. ii) que el programa decida qu procedimientos trafiquen por el rea de overlay. * Si se utiliza la alternativa i se debe tener un buffer para cargar todos los procedimientos no segmentados (como ocurre en Pascal) (El usuario debi de haber distinguido con alguna marca, como la palabra segment, a los procedimientos resdentes de los no residentes) Si no caben en el buffer todos los segmentos residentes se deber marcar un error (como stack overflow) y el usuario deber dejar no residentes a un mayor nmero de segmentos. Si s caben en el buffer todos los segmentos residentes, entonces se deber utilizar un rea de overlay (o pila) para ir cargando a los segmentos no residentes cada vez que sean llamados, y debern de sacarse al terminar su ejecucin. Si en algn momento se terminara el area de overlay se marcara el error de falta de memoria (stack overflow). * Si se utiliza la alternativa ii se debern cargar en un area de overlay todos los segmentos que sea posible, incluyendo por supuesto al segmento que contiene al programa principal.

b)

Ing. Elda G. Quiroga

TRADUCTORES

51

Se deber seguir alguna estrategia de desocupacin para cuando haya que sacar algn segmento para cargar otro que requiere ejecucin. Se debe llevar control en ejecucin de los segmentos cargados en overlay. El problema que puede presentar esta estrategia C es que los segmentos quedan de tamao irregular y puede quedar lento el acceso al archivo, por tener que cargarse cudruplo por cudruplo. d) Segmentacin con paginacin. Esta estretegia es similar a la anterior las diferencias son: - En el directorio que se crea en compilacin se debe tener informacin sobre el nmero de pginas que contiene un segmento, y la direccin de inciso del segmento dentro del archivo, queda relativa al nmero de pgina donde comienza. - El acceso al archivo queda mucho ms rpido por traficar con pginas de 6 bloques completos, de esta manera es posible utilizar instrucciones tales como Blockread que son ms rpidas que las instrucciones como el get. - Se puede evitar desperdicio del rea de overlay por tener fragmentos de pgina vacos teniendo la informacin.

Ing. Elda G. Quiroga

TRADUCTORES

52

BIBLIOGRAFIA
Compilers: Principles, Techniques and Tools Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman Addison Wesley, 1986 The Theory and Practice of Compiler Writing Jean-Paul Tremblay, Paul G. Sorenson McGraw-Hill Compiler Construction Theory and Practice William A. Barret, Rodney M. Bates, David A. Gustafson, John D. Couch Crafting a Compiler Charles N. Fischer, Richard J. Le Blanc, Jr.

- Introduction to Computer Theory Daniel I. A. Cohen John Wiley & Sons, Inc. - The Theory of Parsing, Translation and Compiling; vol 1: Parsing. Alfred Aho, Jeffrey Ullman Prentice-Hall , 1972. Formal Languages and Their Relation to Automata John Hopcroft, Jeffrey Ullman Addison Wesley , 1969 Currents in the Theory of Computation Alfred Aho Prentice-Hall , 1973 Theory of Finite Automata John Carroll , Darrell Long Prentice-Hall , 1989 Compiler Construction for Digital Computers David Gries Wiley International , 1971 Syntax of Programming Languages Roland Backhouse Prentice-Hall , 1979 Machines, Languages and Computation Peter Denning, Jack Dennis, Joseph Qualitz Prentice-Hall , 1978 Compiler Design Theory P. Lewis, D. Rosenkrantz , R. Stearns Addison Wesley , 1976

Ing. Elda G. Quiroga

TRADUCTORES

53