Академический Документы
Профессиональный Документы
Культура Документы
MATERIAL DE APOYO
Ing. Elda Quiroga,M.C.
Dra. Norma F.Roffe,PhD
DEPARTAMENTO DE CIENCIAS COMPUTACIONALES
AGOSTO - DICIEMBRE DE 2007
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.
TRADUCTORES
Lenguaje
LENGUAJES
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.
Se le llama lenguaje abstracto a aqul que se define con el nico propsito de experimentar
nuevas estructuras o reglas de construccin.
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
TRADUCTORES
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.
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:
- 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.
Entrada y salida.
Condicionales.
Ciclos.
Asigancin.
Referencias a subrutinas y/o mtodos.
TRADUCTORES
TRADUCTORES
TEORA DE 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.
r = r = r
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
EXPONENCIACION.
OPERACIONES EN LENGUAJES
LUM
REPRESENTACION
Union de L y M
LM
OPERACION
Concatenacin de L y M
L*
DEFINICION
L U M = { s | s est en L o M }
Li
Li
= L* L
LM = {m | l est en L y m est en M }
i=1
L* = U
i=0
+
L =U
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:
Kleene closure de L
+
L
TRADUCTORES
Positive closure de L
Sea un alfabeto, entonces las expresiones regulares sobre y los conjuntos que
denotan, se definen recursivamente como sigue:
Las expresiones regulares son una notacin especial que facilita la tarea de representar en forma
precisa las reglas de lxico.
EXPRESIONES REGULARES
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).
RS
RS = { wx | (w R) y (x S) }
Ri = R Ri-1
PROPIEDAD
++
--
( )
cerraduras, exponenciacin.
concatenacin.
alternativa (unin).
| es asociativa
| es conmutativa
DESCRIPCION
r | (m | g) = (r | m) | g
r|m=m|r
la concatenacin es asociativa
la relacin entre * y
+ y
la concatenacin es distibutiva
sobre la |
es el elemento identidad de la
concatenacin
es el elemento identidad de la
alternativa
(rm)g = r(mg)
r=r
=r
r(m|g) = rm | rg
(m|g)r = mr | gr
| r = r | = r
la relacin entre *,
)*
)
r* = (r |
TRADUCTORES
* es idempotente
r* = (r + |
r** = r*
Las propiedades algebraicas son leyes que cumplen las expresiones regulares y ademas se utilizan
en la manipulacin de las mismas.
1.
2.
3.
4.
TERMINOLOGIA UTILIZADA:
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.
+
R+S RUS
R | S = { w | (w R) (w S) }
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
R1 = R
R o = { }
= Ro U R1 U R2 ............
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 * = Ri
i=0
= 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
[ R ] R? = Ro U R1
TRADUCTORES
6). Opcin (seleccin). Permite que una expresin regular pueda no aparecer, sta 'operacin' se
define como:
GRAMATICA.
TEORIA DE GRAMATICAS
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.
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:
S XS
S
X aX
X a
aaaX ba
a y b son terminales, X y S son no terminales, S es el smbolo sentencial, y las producciones (P) son:
DERIVACION.
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.
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.
<N>
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 :
<X>
<Y>
a) Secuencia de smbolos
<X>
<X>
TRADUCTORES
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.
11
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>.
10
TRADUCTORES
<X>
a
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
,
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).
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.
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.
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.
L(G2) C
L(G1) C
L(G0)
TRADUCTORES
13
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.
tipo
Nombre
Sin Restricciones
(Unrestricted Grammar)
Sensitivas al Contexto
(Context Sensitive Grammar)
Libres de Contexto
(Context Free Grammar)
Regulares
(Regular Grammar)
JERARQUIA DE CHOMSKY(1959).
Restricciones en las producciones
XY
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.
TRADUCTORES
14
a) Estructura de alternativa.
<X>
b) Estructura de Secuencia.
<X>
c) Estructuras cclicas.
<X>
1 ) <X>
2)
TRADUCTORES
2) <X>
Gramtica equivalente
X->a
X->b
Expresin Regular
X=(a|b)
Gramtica equivalente
X->ab
Expresin Regular
X=ab
Gramticas equivalentes
1) X->Xa
X->a
X->aX
X->a
2)
Expresin Regular
+X = a
Gramticas equivalentes
1)
X->Xa
X->
X->aX
X->
2)
Expresin Regular
*
X=a
Gramticas equivalentes
1) X->X;a
X->a
X->a;X
X->a
2)
Expresin Regular
X=a(;a)*
Gramtica equivalente
X->aY
X->
Y->;aY
Y->
Expresin Regular
X= ( | a(;a)*)
15
<X>
<X>
<B>
<C>
<C> c
<C> c <C>
<B><C><D>
<B>
<B> b <B>
<X>
TRADUCTORES
<D>
;
<D> d
D> d ; <D>
16
A continuacin se muestran los cuatro pasos a seguir para obtener la gramtica libre de
contexto equivalente al diagrama de sintaxis siguiente:
1.
2.
3.
4.
GRAMATICAS
Definiciones Formales
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 ( ).
,
....,
se reduce directamente a .
Tambin se denomina
produce directamente a
Es el resultado de aplicar UNA SOLA regla.
17
........
=
(n pasos de derivacin)
TRADUCTORES
es la cerradura transitiva de
La relacin
transitiva reflexiva de como:
T*
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)
Se dice que
es una Sentencia de G S
Forma Sentencial)
(L)
(L,S)
(L,i)
(S,i)
TRADUCTORES
L , S4) L
(i,i)
18
3) L
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
S11
S 11
L 12
)
(
L 12
(
14 L
S 13
S 15
15 S
,
,
13 L
14 S
i
Arbol de derivacin de
ms a la derecha
i
i
Arbol de derivacin de
ms a la izquierda
Los nmeron indican el orden en que los smbolos no terminales fueron derivados.
L(G) = { w / (w
T*) y ( S
w)
Ambigedad en 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.
TRADUCTORES
19
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
iEtSeS
1 | 2
S
es el trmino comn en las producciones de A.
| iEtS
1 | 2
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
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 | 2 | ... | n |
TRADUCTORES
20
A A |
A 1 | 2 | ... | n
A 1 |
2 | ... | A m | 1 | 2 | ... | n
mediante la siguiente
Una gramtica tiene recursividad izquierda si tiene un no terminal A tal que existe una derivacin
A
para algn string . Algunas tcnicas de anlisis sintctico no pueden manejar
gramticas con recursividad izquierda por ello se debe eliminar primero.
1 A | 2 A | ... | n A
1 A | 2 A | ... | m A |
A
A
FIRST(),
FIRST()
Y1Y2Y3Y4...YK
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
TRADUCTORES
21
. A
SAaa
AB
,
(B),
AB
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.
()
()
TRADUCTORES
22
Metodologas TOP-DOWN
ANLISIS DE SINTAXIS
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.
23
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
TRADUCTORES
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.
STACK
ANALIZADOR DE
LEXICO
PROGRAMA
PREDICTIVO NO RECURSIVO
TABLA
PREDICTIVA
M
TRADUCTORES
SALIDA
24
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.
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.
1. Suposiciones:
2. Inicializacin:
3. Algoritmo :
TRADUCTORES
26
LR Simple (SLR)
La idea central del mtodo SLR es construir un DFA a partir de la gramtica y llenar una Matriz.
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.
Definicin formal:
Sea G = { N, T, P, S } la gramtica a la cual se le desea construir un analizador SLR, entonces se
debe disear la gramtica G' = { N' , T, P' , S'' } donde N' = N U {S'' } y P' = P U { S'' S}.
27
I. Donde
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).
TRADUCTORES
Ij
al
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.
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.
TRADUCTORES
28
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.
L.R. CANNICO
I hacer
B , b ] no est en I hacer
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 .
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.
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
3
TRADUCTORES
30
ANLISIS SEMNTICO Y
GENERACIN DE CDIGO INTERMEDIO
ANLISIS SEMNTICO.
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 * + :=
TRADUCTORES
31
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
Operando1
Operando2
Triplos
La ejecucin de los triplos tambin requiere de una pila. El algoritmo para ejecutar triplos es :
Operando2
Resultado
Cudruplos
Operando1
T1
T2
A
32
TRADUCTORES
Operando
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
Carga B
Carga C
Carga D
Multiplica
Suma
Almacena A
- Notacin polaca
- Cdigo P
- Triplos
- Cudruplos
- Cudruplos
- Triplos, Cdigo P
- Notacin polaca
- Cudruplos
- Triplos, Cdigo P
- Notacin polaca
TRADUCTORES
33
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.
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.
<T>
id
A continuacin se muestra el subconjunto de las expresiones que utilizaremos para disear sus
acciones de generacin de cdigo.
<E>
T
<F>
TRADUCTORES
34
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.
Para generar cdigo en notacin polaca, al que llamaremos vector polaco requeriremos:
- Pila de Operadores
- Vector para almacenar el cdigo
<T>
id
E
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.
<F>
1.- Escribir en el vector polaco, la direccin de la variable generada por el anlisis de lxico.
2.- Push pila-de-operadores(+)
3.- Push pila-de-operadores(*)
4.- 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.
TRADUCTORES
35
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.
<F>
<T>
id
E
F
*
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.- Escribir en el vector polaco, la direccin de la variable generada por el anlisis de lxico.
2.- Push pila-de-operadores(+)
3.- Push pila-de-operadores(*)
4.- 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.
TRADUCTORES
37
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.
1.2.3.4.-
5.6.7.8.9.-
<E>
< ES >
ES
8
op.rel
<T>
ES
4
T
*
and
id
or
<F>
TRADUCTORES
38
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.
ANLISIS SEMNTICO
TIPO
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
op1
E
R
E
R
C
S
C
S
B
op2
E
R
R
R
X
X
X
X
X
*,+,-
R
R
R
R
X
X
X
X
X
E
X
X
X
X
X
X
X
X
div mod
B
B
B
B
B
B
B
B
B
relac
X
X
X
X
X
X
X
X
B
and or
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
E
E
R
R
C
C
S
S
B
TRADUCTORES
39
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.
40
IF
(* incondicional *)
(* que efecta un salto si el operando tiene un valor de falso*)
1
THEN
TRADUCTORES
<S>
Estatuto IF-THEN
1.-
2.-
41
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.
goto
gotofalso operando
gotoverdadero operando
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:
ESTATUTOS CONDICIONALES
<T>
4
F
<F>
id
ESTATUTOS
<E>
TRADUCTORES
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.
1.2, 3
4.-
5.6, 7
IF
Estatuto IF-THEN-ELSE
<S>
of
OPCION
THEN
ESTAT
EXP_ORDINAL
pila-de-operandos = PilaO
pila-de-operadores = Poper
pila-de-saltos = Psaltos
pila-de-tipos = PTipos
EXP
2
..
ELSE
ELSE
3
S
ESTAT
<OPCION>
TRADUCTORES
END
42
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
EXP_ORDINAL
CASE
<ESTAT>
Estatuto CASE
1.2.-
3.-
4.-
5.-
6.7.-
DO
43
ESTATUTOS DE REPETICIN
<S>
Estatuto WHILE
WHILE
TRADUCTORES
Estatuto REPEAT
<S>
FOR
Id
REPEAT
1
:=
,
S
Exp
UNTIL
TO
<For>
Estatuto FOR
1.2.3.-
4.-
Exp
3
DO
TRADUCTORES
44
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).
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
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
TRADUCTORES
45
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.
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.
Nombre
ARRAY
Li2 Ls2
m2
CTE
,
..
CTE
......
Lin Lsn
s
of
TIPO
46
id
1.2.3.4.5.6.7.-
8.-
TRADUCTORES
1.2.-
3.-
4.5.-
TRADUCTORES
47
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.
,
ID
:
TIPO
VAR
5
6
BLOQUE
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.
ID
TRADUCTORES
48
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.
EXP
<ESTATUTO>
ID
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.
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.
TRADUCTORES
49
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.
ADMINISTRACIN DE LA MEMORIA
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.
b)
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.
Para esta estrategia, el traductor debe crear un diccionario de pginas que indique en
qu parte del archivo qued grabada cada pgina.
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.
c)
d)
TRADUCTORES
50
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.
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.
b)
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.
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.
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).
TRADUCTORES
51
d)
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.
Segmentacin con paginacin.
TRADUCTORES
52
Crafting a Compiler
Charles N. Fischer, Richard J. Le Blanc, Jr.
TRADUCTORES
BIBLIOGRAFIA
53