Вы находитесь на странице: 1из 27

TRADUCTORES

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

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

Lenguaje

LENGUAJES

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.

TRADUCTORES

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

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.

Ing. Elda G. Quiroga

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.
Entrada y salida.
Condicionales.
Ciclos.
Asigancin.
Referencias a subrutinas y/o mtodos.

No se deber olvidar incluir estatutos de:


-

-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.

TRADUCTORES

-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

-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.

TRADUCTORES

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

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.

y tiene una longitud cero.

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

Un LENGUAJE es cualquier conjunto de "strings" sobre un alfabeto.


OPERACIONES SOBRE STRINGS.

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.

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

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

Ing. Elda G. Quiroga

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

Formalmente, una expresin regular se define por:

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*

Ing. Elda G. Quiroga

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

PROPIEDADES ALGEBRAICAS DE LAS EXPRESIONES REGULARES.

1.
2.
3.
4.

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. 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)

TERMINOLOGIA UTILIZADA:

Alfabeto utilizado (conjunto finito de smbolos).

elemento del conjunto


w,x,y
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.

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

2). Concatenacin. Representa la 'concatenacin' de dos cadenas generadas por R y por S


respectivamente, sta se denota como:

R1 = R

3). Exponenciacin. Representa la repeticin controlada de una expresin regular ('n'


concatenaciones de la exp. regular consigo misma), esta operacin se define recursivamente
como:

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:

Ing. Elda G. Quiroga

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.

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:

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.

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.

<N>

Referencia a un smbolo terminal

Indica la secuencia del orden a seguir

Referencia a un diagrama de sintaxis.

Nombre del diagrama de sintaxis.

NOTACION DE LOS DIAGRAMAS DE SINTAXIS.

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.

b) Alternativa entre varios smbolos

Ing. Elda G. Quiroga

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

Ejemplo. derivar el "string" ababa utilizando la gramtica G1 anterior

TRADUCTORES

S XS aXS aaXS aaaXS aaaaXS abaXS abaaXS


abaaaXS abaaaaXS ababaS ababa

Ing. Elda G. Quiroga

<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

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

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.

L(G2) C

L(G1) C

L(G0)

donde C significa subconjunto de

La jerarqua de estas gramticas y las relaciones entre ellas, se da como:


L(G3)

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.

Ing. Elda G. Quiroga

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

X = cualquier string, al menos tiene un smbolo


no_terminal
Y = cualquier string
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

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.

TRADUCTORES

14

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

a) Estructura de alternativa.

PATRONES SINTACTICOS MAS COMUNES.

<X>

b) Estructura de Secuencia.
<X>

c) Estructuras cclicas.

<X>

1 ) <X>

2)

TRADUCTORES

d) Estructuras cclicas con separador.


1)
<X>

2) <X>

Ing. Elda G. Quiroga

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

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.

<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.

Ing. Elda G. Quiroga

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 ( ).

,
....,

se reduce directamente a .

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

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

17

. Si n = 0, entonces se define la cerradura


=

........

(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)

TRADUCTORES

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

Ing. Elda G. Quiroga

T*

(Toda sentencia es una

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)

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
en orden de izquierda a
4. Si los nodos N, N,...N son descendientes directos de N,
derecha y se llaman respectivamente A, A,....,A, entonces
AA ....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 :

(L)

(L,S)

(L,i)

(S,i)

TRADUCTORES

L , S4) L

(i,i)

18

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 :

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

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:

Ing. Elda G. Quiroga

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)

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:

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.

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

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.

iEtSeS

1 | 2

S
es el trmino comn en las producciones de A.

| iEtS

Existen gramticas que tiene producciones de la forma

como por ejemplo


donde

1 | 2

se transforman en las siguientes

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 |

1. Agrupar todas las producciones de A, sin importar cuantas sean.

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

TRADUCTORES

20

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


transformacin

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

Ing. Elda G. Quiroga

ELIMINACION DE RECURSIVIDAD IZQUIERDA INMEDIATA.

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.

Pasos para eliminar la recursividad izquierda inmediata.

1. Agrupar todas las producciones de A, sin importar cuantas sean.

donde i no inicia con A.

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

2. Reemplazar las producciones de A a un conjunto equivalente


transformacin :

A
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

FIRST(),

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()

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

-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

TRADUCTORES

21

-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

. A

SAaa

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( ).

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

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).

Ing. Elda G. Quiroga

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

El anlisis bottom-up del string abbcde es:


3
2
4

abbcde aAbcde aAde aABe S

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

El anlisis Top-down del string abbcde es:


1
2
3

TRADUCTORES

S aABe aAbcBe abbcBe abbcde

Ing. Elda G. Quiroga

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.

STACK

ANALIZADOR DE
LEXICO

PROGRAMA
PREDICTIVO NO RECURSIVO

TABLA
PREDICTIVA
M

TRADUCTORES

SALIDA

24

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.

Ing. Elda G. Quiroga

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

TRADUCTORES

25

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

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. :

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:

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.

2. Inicializacin:

3. Algoritmo :

TRADUCTORES

26

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

CONSTRUCCION DE LA MATRIZ SLR

Definiciones necesarias para la construccin de la matriz SLR:

LR Simple (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
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

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).

Ing. Elda G. Quiroga

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.

, entonces aadir shift j a la tabla de

C = { Io, I1, I2, In }


Ii . Las acciones correspondientes

de la tabla se construye a partir de

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.

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'
2. El estado
estado i se determinan como sigue:
a). Si Aa est en Ii y GOTO(Ii , a) =

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.

Ing. Elda G. Quiroga

L.R. CANNICO

I hacer

B , b ] no est en I hacer

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 .

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 );

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.

TRADUCTORES

29

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

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

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

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 * + :=

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

Ing. Elda G. Quiroga

Operando1

Operando2

Este tipo de cdigo utiliza instrucciones con un formato de tres campos


Cdigo de
Operacin

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

Triplos

La ejecucin de los triplos tambin requiere de una pila. El algoritmo para ejecutar triplos es :

Operando2

Resultado

Cudruplos

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 )

Operando1

Este tipo de cdigo utiliza instrucciones con un formato de cuatro campos


Cdigo de
Operacin

T1
T2
A

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

32

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:

TRADUCTORES

PARA cada cudruplo HACER


SI el operador es binario ENTONCES
Resultado := operando1 operador operando2
...... (*diversas operaciones*)

Ing. Elda G. Quiroga

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

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

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.

Ing. Elda G. Quiroga

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.

<T>

id

A continuacin se muestra el subconjunto de las expresiones que utilizaremos para disear sus
acciones de generacin de cdigo.
<E>
T

<F>

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.

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.

Ing. Elda G. Quiroga

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

<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>

Acciones de generacin de cdigo


<E>

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.

Generacin de Notacin Polaca para asociatividad izquierda

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.

Ing. Elda G. Quiroga

<F>

Acciones de generacin de cdigo


<E>

<T>

id
E

F
*

1.- Escribir en el vector polaco, la direccin de la variable generada por el 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
Cabe hacer notar que por el momento se est asumiendo que todas las variables son globales,

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 )

TRADUCTORES

36

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

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.

- Avail de direcciones temporales


- Espacio para almacenar los cudruplos generados

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

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

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.

Ing. Elda G. Quiroga

1.2.3.4.-

5.6.7.8.9.-

<E>

< ES >

ES

8
op.rel

<T>

ES

4
T
*

and

id

or

<F>

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.

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.

Ing. Elda G. Quiroga

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

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

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.

Ing. Elda G. Quiroga

40

IF

(* 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*)

1
THEN

TRADUCTORES

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)

<S>

Estatuto IF-THEN

1.-

2.-

Ing. Elda G. Quiroga

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.

rellenar(direccin a rellenar, valor con que se rellena)

Generalmente, al generar un goto, an no sabemos a qu direccin saltar, entonces quedar


pendiente por rellenar; para efectuar esta funcin utilizaremos al procedimiento:

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

GENERACIN DE CDIGO PARA

<T>

ACCIONES PARA VERIFICACIN SEMNTICA

4
F

<F>

id

ESTATUTOS

<E>

TRADUCTORES

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

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

Ing. Elda G. Quiroga

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

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:

<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.-

Ing. Elda G. Quiroga

4.-

5.-

6.7.-

DO

43

ESTATUTOS DE REPETICIN

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

<S>

Estatuto WHILE
WHILE

TRADUCTORES

1.- Meter cont en PSaltos


2.- 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)

Ing. Elda G. Quiroga

Estatuto REPEAT
<S>

FOR

Id

REPEAT

1
:=

,
S

Exp

UNTIL

TO

1.- PUSH pila-de-saltos (cont)


2.- Generar gotofalso POP pila-de-operandos POP pila-de-saltos

<For>

Estatuto FOR

1.2.3.-

4.-

Exp

3
DO

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.

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).

Ing. Elda G. Quiroga

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)

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.

Ing. Elda G. Quiroga

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

Una posible estructura de datos para efectuar la declaracin y almacenarla en la tabla de


smbolos sera:
Tabla de smbolos
Li1 Ls1
m1

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

< DIM >

id

Declaracin de VARIABLES DIMENSIONADAS

1.2.3.4.5.6.7.-

8.-

TRADUCTORES

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

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:

< VARIABLE >


id

Acceso a VARIABLES DIMENSIONADAS

1.2.-

3.-

4.5.-

PUSH PilaO (id)


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)
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)
DIM = DIM + 1
Actualizar DIM en PilaDimensionadas
Obtener siguiente campo de descripcin
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

TRADUCTORES

47

Nota : Se debe aadir la verificacin semntica para reconocer si coincide la cantidad de


dimensiones declarada, con la referida.

Ing. Elda G. Quiroga

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.

,
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

Acciones para la definicin de un PROCEDIMIENTO


<PROC'S>
PROCEDURE
;

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.

Ing. Elda G. Quiroga

EXP

Acciones para la llamada a un PROCEDIMIENTO

<ESTATUTO>
ID

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 *)
K = K + 1, apuntar al siguiente parmetro.
Verificar que el ltimo parmetro apunte a Nulo. (para congruencia en # de parmetros).
Generar GOSUB, nombre-proc, dir. de inicio .
4.5.6.-

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.

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.

Ing. Elda G. Quiroga

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.

ADMINISTRACIN DE LA MEMORIA AL MOMENTO DE GENERAR


CDIGO INTERMEDIO.

b)

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.

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)

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.

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.

Ing. Elda G. Quiroga

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.

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.

Cada parntesis hace referencia a las estrategias vistas en el tema de "Administracin de la


memoria al momento de generar cdigo intermedio".

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

* 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.

Ing. Elda G. Quiroga

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

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

Crafting a Compiler
Charles N. Fischer, Richard J. Le Blanc, Jr.

Compiler Construction Theory and Practice


William A. Barret, Rodney M. Bates,
David A. Gustafson, John D. Couch

The Theory and Practice of Compiler Writing


Jean-Paul Tremblay, Paul G. Sorenson
McGraw-Hill

Compilers: Principles, Techniques and Tools


Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman
Addison Wesley, 1986

- Introduction to Computer Theory


Daniel I. A. Cohen
John Wiley & Sons, Inc.

Machines, Languages and Computation


Peter Denning, Jack Dennis, Joseph Qualitz
Prentice-Hall , 1978

Syntax of Programming Languages


Roland Backhouse
Prentice-Hall , 1979

Compiler Construction for Digital Computers


David Gries
Wiley International , 1971

Theory of Finite Automata


John Carroll , Darrell Long
Prentice-Hall , 1989

Currents in the Theory of Computation


Alfred Aho
Prentice-Hall , 1973

Formal Languages and Their Relation to Automata


John Hopcroft, Jeffrey Ullman
Addison Wesley , 1969

- The Theory of Parsing, Translation and Compiling; vol 1: Parsing.


Alfred Aho, Jeffrey Ullman
Prentice-Hall , 1972.

TRADUCTORES

Compiler Design Theory


P. Lewis, D. Rosenkrantz , R. Stearns
Addison Wesley , 1976

Ing. Elda G. Quiroga

BIBLIOGRAFIA

53

Вам также может понравиться