Sunteți pe pagina 1din 29

UNIVERSIDAD JOS ANTONIO PEZ

TRADUCTORES E INTERPRETADORES

Unidad I

Fundamentos para el diseo de


Compiladores

1 de 29

Fundamentos para los Compiladores


Introduccin
La fase de anlisis descompone el programa fuente en piezas componentes y produce
una representacin interna.
La fase de sntesis traduce el cdigo intermedio generado por la fase de anlisis en el
programa destino.
El anlisis se organiza de acuerdo a la sintaxis del lenguaje, es decir, el formato
apropiado de sus programas. Por otro lado, la semntica define lo que el programa
hace al momento de ser ejecutado.
Usaremos la notacin llamada gramticas sin contexto o Forma de Backus-Naur para
especificar la sintaxis.
La semntica, por tanto, es difcil de describir con las notaciones disponibles. Por lo
tanto, se usan descripciones informales y ejemplos sugerentes.

2 de 29

Fundamentos para los Compiladores


Introduccin
La gramtica libre de contexto puede usarse para ayudar a guiar la traduccin de
programas.
Un analizador lxico permite que un traductor maneje instrucciones de varios
caracteres como identificadores. Estas se escriben como secuencias de caracteres pero
se tratan como tokens durante el anlisis sintctico.

3 de 29

Fundamentos para los Compiladores


Definicin de Sintaxis
Una gramtica describe la estructura jerrquica de las instrucciones de un lenguaje de
programacin. Veamos la siguiente instruccin if-else de un lenguaje:
if (expr) instr else instr
Siendo instr una variable para denotar una instruccin y expr otra variable para
denotar una expresin, esta regla de estructuracin se expresa como:
instr

if (expr) instr else instr

La flecha se lee puede tener la forma. A esta regla se le llama produccin, los
elementos lxicos como if, else y los parntesis se les llama terminales, mientras
que las variables instr y expr representan secuencias de terminales llamadas no
terminales.

4 de 29

Fundamentos para los Compiladores


Definicin de gramticas
Una gramtica libre de contexto tiene cuatro componentes:
1. Un conjunto de smbolos terminales que algunas veces son llamados tokens. Son
los smbolos elementales del lenguaje definido por la gramtica.

2. Un conjunto de no terminales que algunas veces son llamados variables


sintcticas. Representan un conjunto de cadenas o terminales.
3. Un conjunto de producciones que constan de un no terminal llamado lado
izquierdo o encabezado, una flecha y una secuencia de terminales y no
terminales llamado lado derecho o cuerpo.
Representa una de las formas escritas de una instruccin. Si el no terminal
del encabezado representa a una instruccin, el cuerpo representa una
forma escrita de la instruccin.
4. Una designacin de una de las no terminales como el smbolo inicial.

El trmino libre de contexto se refiere al hecho de que un no terminal puede siempre


ser sustituido por una cadena de terminales sin tener en cuenta el contexto en el que
5 de 29
ocurra

Fundamentos para los Compiladores


Definicin de gramticas
Para especificar las gramticas se presentan sus producciones en donde primero se
listan las producciones para el smbolo inicial.
Los dgitos, los signos como < y <= y las cadenas en negrita como while son
terminales. Tambin se puede asumir que cualquier nombre o smbolo que no este en
cursiva son terminales.
Un nombre en cursiva es un no terminal.
Las producciones que posean el mismo no terminal que el encabezado pueden
agrupar sus cuerpos separados con el smbolo | que se lee o.
El smbolo inicial se determina por el no terminal cuyas producciones se den primero,
establecidos por el diseo previo del compilador.

6 de 29

Fundamentos para los Compiladores


Definicin de gramticas
Estudiemos la gramtica para expresiones como 9-5+2, 3-1 o 7. Las producciones son:
lista
lista + digito
lista
lista - digito
lista
digito
digito
0 | 1 | 2 | | 9
Como deben aparecer smbolos positivos y negativos entre dos dgitos, nos referimos a
estas expresiones como listas de dgitos separados por signos positivos o negativos.
Las derivaciones son cadenas de terminales que pueden derivarse del smbolo inicial
del lenguaje definido por la gramtica. Una gramtica deriva cadenas empezando con
el smbolo inicial y sustituyendo en forma repetida un no terminal, mediante el cuerpo
de una produccin para ese no terminal.
Se pueden agrupar algunas producciones? Cules son los terminales y no
terminales? Cul es el smbolo inicial?

7 de 29

Fundamentos para los Compiladores


Definicin de gramticas
Producciones agrupadas
lista
lista + digito | lista digito | digito
Terminales
+ - 0 1 2 3 4 5 6 7 8 9
No terminales
lista y digito
El smbolo inicial es lista.
Si el no terminal es el encabezado de la produccin, decimos que es una produccin
para un no terminal.
Una cadena de terminales es una secuencia de cero o ms terminales.
La cadena de cero terminales se llama vaca y es escrita como .
8 de 29

Fundamentos para los Compiladores


Derivaciones
Una gramtica deriva cadenas comenzando por el smbolo inicial y sustituyendo
repetidamente un no terminal, mediante el cuerpo de la produccin para ese no
terminal.
Las cadenas de terminales que pueden derivarse del smbolo inicial del lenguaje
definido por la gramtica.
Veamos las derivaciones para el lenguaje del ejemplo anterior
lista
lista + digito
(2.1)
lista
lista digito
(2.2)
lista
digito
(2.3)
digito
0 | 1 | 2 | | 9 (2.4)
La produccin (2.4) establece que los terminales 0, 1 9 representan las diez
producciones para el no terminal digito. La produccin (2.3) dicta que un digito
por si solo es una lista. Las producciones (2.2) y (2.1) establecen que cualquier
lista seguidas del terminal + o - seguido de un digito forma una nueva lista.
Qu podemos deducir de 9 5 + 2?
9 de 29

Fundamentos para los Compiladores


Derivaciones
lista
lista
lista
digito

lista + digito
lista digito
digito
0 | 1 | 2 | | 9

(2.1)
(2.2)
(2.3)
(2.4)

a) 9 es un digito por la produccin (2.4) luego 9 es una lista por la


produccin (2.3).
b) 9 - 5 es una lista por la produccin (2.2) ya que 9 es una lista y 5 un
digito por la produccin (2.4).
c) 9 - 5 + 2 es una lista por la produccin (2.1) ya que 9 - 5 es una lista y 2
un digito por la produccin (2.4).
El anlisis sintctico (parsing) es el problema de tomar una cadena de terminales y
averiguar cmo derivarla a partir del smbolo inicial de la gramtica. Si no puede
derivarla se deben reportar los errores dentro de la cadena.

En general, un programa fuente tiene lexemas de varios caracteres que el analizador


lxico agrupa en tokens cuyos primeros componentes son los terminales procesados
por el analizador sintctico.
10 de 29

Fundamentos para los Compiladores


rboles de anlisis sintctico
Muestra, en forma grfica, la manera en la que el smbolo inicial de una gramtica
deriva a una cadena en el lenguaje.
Si el no terminal A tiene una produccin A
XYZ, entonces un rbol de anlisis
podra tener un nodo interior etiquetado como A con tres hijos llamados X, Y y Z, de
izquierda a derecha.
A
X
Y
Z
Dada una gramtica libre de contexto, un rbol de anlisis sintctico posee las
siguientes propiedades:
1. La raz se etiqueta con el smbolo inicial.
2. Cada hoja se etiqueta con un terminal, o con .
3. Cada nodo interior se etiqueta con un no terminal.
4. Si A es el no terminal que etiqueta a cierto nodo interior, y X1, X2, , Xn son las
etiquetas de los hijos de ese nodo de izquierda a derecha, entonces debe haber
una produccin A
X1X2Xn. Las etiquetas X1 a Xn representan un smbolo
que pueden ser o no un terminal. Como un caso especial, si A es una
produccin, un nodo etiquetado como A puede tener un solo hijo etiquetado
11 de 29
como .

Fundamentos para los Compiladores


rboles de anlisis sintctico
Como ejemplo, la cadena 9 - 5 + 2 del lenguaje anterior se ilustra mediante el rbol a
continuacin:
lista

lista
lista

digito

digito

digito

Cada nodo en el rbol se etiqueta mediante un smbolo de la gramtica. Un nodo


interior corresponde al encabezado de una produccin mientras que su hijo al cuerpo
de la misma produccin.
12 de 29

Fundamentos para los Compiladores


rboles de anlisis sintctico
De izquierda a derecha, las hojas de un rbol de anlisis sintctico forman la derivacin
del rbol: la cadena que se genera o deriva del no terminal en la raz del rbol de
anlisis sintctico.
Cualquier rbol imparte un orden natural de izquierda a derecha a sus hojas, en la idea
de que si X y Y son dos hijos con el mismo padre, y X esta a la izquierda de Y, entonces
los descendientes de X estn a la izquierda de los descendientes de Y.
El lenguaje generado por una gramtica puede definirse como el conjunto de cadenas
que puede generar cierto rbol de anlisis sintctico.
Al proceso de encontrar un rbol de anlisis sintctico para una cadena dada se le
denomina analizar sintcticamente esa cadena.

13 de 29

Fundamentos para los Compiladores


Ambigedad
Se debe tener mucho cuidado cuando se habla sobre la estructura de una cadena de
acuerdo a una gramtica.
Una gramtica puede tener ms de un rbol de anlisis sintctico que genere una
cadena dada de terminales.
A esto se le conoce como ambigedad.
Se demuestra buscando una cadena que sea el resultado de la derivacin de ms de
un rbol de anlisis sintctico.
Debido a que una cadena con mas de un rbol de anlisis sintctico tiene, por lo
general ms de un significado, se deben disear gramticas no ambiguas para las
aplicaciones de compilacin, o utilizar gramticas ambiguas con reglas adicionales para
resolver las ambigedades.

14 de 29

Fundamentos para los Compiladores


Ambigedad
Qu pasa si sobrescribimos el lenguaje de nuestros ejemplos y solo establecemos un
no terminal cadena y no diferenciamos entre digito y lista?
cadena
cadena + cadena
cadena
cadena - cadena
cadena
0 | 1 | 2 | | 9
La expresin 9 - 5 + 2 tiene ms de un rbol de anlisis sintctico con esta gramtica.
Cada rbol corresponde al concepto de aplicar parntesis (9 - 5) + 2 o (9 - 5) + 2.
cadena

cadena

cadena

cadena

cadena

cadena

cadena

cadena

cadena

cadena

En el segundo se obtiene el valor incorrecto 2 en vez del correcto 6. La gramtica


anterior no permite esto.
15 de 29

Fundamentos para los Compiladores


Asociatividad de los operadores
Cuando los operandos tienen operadores a su izquierda y a su derecha, se requieren
convenciones para decidir qu operador se aplica a ese operando.
En la mayora de los lenguajes de programacin, los operadores aritmticos son
asociativos por la izquierda.
Un ejemplo de operadores asociativos por la derecha son los operadores de
exponenciacin y la asignacin.
Para expresiones como a = b = c con un operador asociativo a la derecha, podemos
establecer la siguiente gramtica:
derecha
letra = derecha | letra
letra
a | b | | z
Mostremos un contraste entre el rbol de anlisis sintctico generado por esta
gramtica y el rbol de anlisis sintctico para la expresin 9 - 5 - 2 de la gramtica de
ejemplos anteriores.

16 de 29

Fundamentos para los Compiladores


Asociatividad de los operadores
lista

derecha

lista

lista

derecha

cadena

digito

letra

letra

derecha

derecha

digito

Un rbol de anlisis sintctico para un operador asociativo por la izquierda crece hacia
abajo y a la izquierda.

Un rbol de anlisis sintctico para un operador asociativo por la derecha crece hacia
abajo y a la derecha.
17 de 29

Fundamentos para los Compiladores


Precedencia de los operadores
Las reglas que definen la precedencia relativa de los operadores son necesarias cuando
existe ms de un tipo de operador presente en la gramtica.
Un operador tiene ms precedencia que otro si el primer operador recibe sus
operandos antes que el segundo.
Hagamos un ejemplo de gramtica para expresiones aritmticas a partir de una tabla
que muestre la asociatividad y la precedencia de operadores. Expresamos los cuatro
operadores comunes y una tabla de precedencia ordenada de menor a mayor
precedencia. Los operadores en la misma lnea tienen la misma asociatividad y
precedencia
Asociativo por la izquierda: + Asociativo por la derecha: * /
Creamos dos no terminales llamadas expr y term para los dos niveles de
precedencia, y un no terminal factor para los elementos bsicos, que son los dgitos
y expresiones entre parntesis.
factor

digito | (expr)
18 de 29

Fundamentos para los Compiladores


Precedencia de los operadores
Ahora consideramos los operadores binarios que tienen la mayor precedencia, que son
* y /. El no terminal term expresa listas de trminos separados por estos operadores.
term
term * factor | term / factor | factor
De manera similar, expr genera listas de trminos separados por los operadores de
menor precedencia + y -.
expr
expr + term | expr term | term
Por lo tanto la gramtica resultante es la siguiente:
expr
expr + term | expr term | term
term
term * factor | term / factor | factor
factor
digito | (expr)
Una expresin es una lista de trminos separados por los signos + o -, y un termino es
una lista de factores separados por los signos * o /.

Cualquier expresin entre parntesis es un factor, lo que permite desarrollar


expresiones que tengan un anidamiento con profundidad arbitraria, as como arboles
de profundidad arbitraria.
19 de 29

Fundamentos para los Compiladores


Traduccin dirigida por la sintaxis
Se realiza uniendo reglas o fragmentos de un programa a las producciones de una
gramtica.
Considere la siguiente produccin:
expr

expr1 + term

Aqu, expr es la suma de dos subexpresiones expr1 (distinta del encabezado) y


term. Se puede traducir expr explotando su estructura como en el siguiente
seudocdigo:
traducir expr1;
traducir term;
manejar +;
Este ejemplo es la traduccin de expresiones de la notacin infija a la notacin postfija.
Mediante una variante de este seudocdigo, se construye un rbol sintctico para
expr. Se crean a su vez rboles sintcticos para expr1 y term, y despus se maneja
el + construyndole un nodo.
20 de 29

Fundamentos para los Compiladores


Traduccin dirigida por la sintaxis
Existen dos conceptos importantes a destacar en la traduccin dirigida por la sintaxis.
1. Atributo: cualquier cantidad asociada con una construccin de programacin.
Algunos ejemplos son los tipos de datos de las expresiones, el nmero de
instrucciones en el cdigo generado, la ubicacin de la primera instruccin en el
cdigo generado para una construccin, entre otros. Como se utilizan smbolos
de la gramtica (no terminales y terminales) para representar las construcciones
de programacin, extendemos la nocin de los atributos, de las construcciones a
los smbolos que representan.
2. Esquema de la traduccin (orientada a la sintaxis): una notacin para unir los
fragmentos de un programa a las producciones de una gramtica. Los fragmentos
del programa se ejecutan cuando se utiliza la produccin durante el anlisis
sintctico. El resultado combinado de todas estas ejecuciones de los fragmentos,
en el orden inducido por el anlisis sintctico, produce la traduccin del
programa al cual se aplica el proceso de anlisis/sntesis.

21 de 29

Fundamentos para los Compiladores


Notacin postfija
La notacin postfija para una expresin E se puede definir de manera inductiva como
se muestra a continuacin:
1. Si E es una variable o constante, entonces la notacin postfija para E es la misma
E.
2. Si E es una expresin de la forma E1 op E2, en donde op es cualquier operador
binario, entonces la notacin postfija para E es E1 E2 op, en donde E1 y E2
son las notaciones postfija para E1 y E2, respectivamente.
3. Si E es una expresin con parntesis de la forma (E1), entonces la notacin
postfija para E es la misma que la notacin postfija para E1.

La notacin postfija para (9-5)+2 es 95-2+. Las traducciones de los dgitos son las
mismas constantes en base a la regla (1). Entonces, la traduccin de 9-5 es 95- en base
a la regla (2). La traduccin de (9-5) es la misma en base a la regla (2). Habiendo
traducido la subexpresin con parntesis, podemos aplicar la regla (2) a toda la
expresin, con (9-5) en el papel de E1 y 2 en el papel de E2, para obtener el resultado
95-2+.

22 de 29

Fundamentos para los Compiladores


Notacin postfija
En la notacin postfija no hay necesidad de parntesis, debido a que la posicin y el
nmero de argumentos (aridad) de los operadores solo permiten una decodificacin
de una expresin postfija.
Se explora la cadena postfija partiendo desde la izquierda hasta encontrar un
operador, luego se busca a la izquierda el nmero apropiado de operandos.
Se evala el operador con los operandos y se sustituyen por el resultado. Se repite el
proceso hacia la derecha en busca de otro operador.
Cul sera el resultado para la expresin postfija 952-+3*?

23 de 29

Fundamentos para los Compiladores


Atributos sintetizados
Hasta el momento hemos estudiado que asociar cantidades con construcciones de
programacin puede expresarse en trminos de gramtica.
Asociamos los atributos con los terminales y no terminales.

Unimos reglas a las producciones de la gramtica. Describen la manera en la que se


realizan clculos entre los atributos en esos nodos del rbol de anlisis sintactico en
donde la produccin en cuestin se utiliza para relacionar un nodo con sus hijos.
Una definicin orientada a la sintaxis se asocia:
1. Con cada smbolo de gramatica, un conjunto de atributos
2. Con cada produccin, reglas semnticas.
Los atributos se evalan de la siguiente forma:
1. Para una entrada X, se construye un rbol de anlisis sintctico.
2. Se aplican las reglas semnticas para evaluar los atributos

Un atributo esta sintetizado si su valor en el nodo N de un rbol de anlisis sintctico


se determina mediante los valores de los atributos del hijo de N y del mismo N.
24 de 29

Fundamentos para los Compiladores


Recorrido de los rboles
Se utilizan para describir la evaluacin de los atributos y especificar la ejecucin de los
fragmentos de cdigo en un esquema de traduccin.
Comienza por la raz y visita cada nodo del rbol en cierto orden.

El recorrido tipo primero en profundidad es un recorrido de abajo-arriba, porque


recorre primero los nodos hoja antes de los nodos internos.
Los recorridos en postorden o en preorden son un ejemplo de este tipo de recorrido.

25 de 29

Fundamentos para los Compiladores


Esquemas de traduccin
Es una notacin para especificar una traduccin, uniendo los fragmentos de un
programa a las producciones en una gramtica.
Es como una definicin orientada a la sintaxis, solo que el orden de la evaluacin de las
reglas semnticas se especifica en forma explicita.
Los fragmentos de un programa incrustados en los cuerpos de las producciones se
llaman acciones semnticas.
La posicin de la ejecucin se muestra encerrada entre llaves y se escribe dentro del
cuerpo de la produccin.
resto

+ term {print(+)} resto1

26 de 29

Fundamentos para los Compiladores


Anlisis sintctico
El parsing es el proceso de determinar cmo puede generarse una cadena de
terminales mediante una gramtica.
Los compiladores no construyen los rboles de anlisis sintctico en practica, pero en
principio debe construirlo o no podr garantizar que la traduccin sea la correcta.
Los mtodos de anlisis requieren de un costo en tiempo elevado para poder analizar
una cadena de terminales, sin embargo en la prctica con lenguajes de programacin
reales se puede analizar esta gramtica con relevante sencillez.
La mayora de los mtodos de anlisis sintcticos se adaptan a una de dos clases, por
mtodo descendente o mtodo ascendente.
El primero construye desde la raz y procede a las hojas.
El segundo comienza desde las hojas hasta la raz.
La seleccin de una produccin para un no terminal puede requerir de un proceso de
prueba y error.
Se hace uso de la expresin cuando no se encuentra una coincidencia dentro del
27 de 29
conjunto de producciones.

Fundamentos para los Compiladores


Anlisis sintctico predictivo
El anlisis sintctico de descenso recursivo es un mtodo de anlisis sintctico
descendente que usa procedimientos recursivos para el anlisis de la entrada.
Este anlisis se basa en la informacin acerca de los primeros smbolos que pueden
generarse mediante el cuerpo de una produccin.
El smbolo de preanlisis determina sin ambigedad el flujo de control a travs del
cuerpo del procedimiento para cada no terminal.

28 de 29

Fundamentos para los Compiladores


Tabla de Smbolos
Estructuras de datos que utilizan los compiladores para guardar informacin acerca de
las construcciones de un programa fuente.
Se recolecta de forma incremental mediante las fases de anlisis de la compilacin.

La fase de sntesis utilizan esta estructura para generar el cdigo destino.


Una accin semntica almacena la informacin, una accin semntica relacionada a
una produccin obtiene esta informacin .
Las entradas poseen informacin como su cadena de caracteres (lexema), tipo,
posicin
Cuando se habla de alcances, cada bloque de programa posee una tabla para dicho
alcance.

29 de 29

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