Está en la página 1de 48

Universidad Jurez

Autnoma de Tabasco

Lic. En sistemas computacionales:


Carlos Mario Palma Monjaraz
(122h8065)
Materia:
Compiladores
Maestro:
Adn Garca Gmez
Divisin Acadmica De Informtica y
Sistemas
Fecha de entrega:
Viernes 28 de noviembre de 2014

45

Compiladores

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Contenido
INTRODUCCIN....................................................................................................... 4
TEMA I GENERALIDADES......................................................................................... 5
1.1.1. (HISTORIA)................................................................................................... 5
1.1.2 INICIO DEL COMPILADOR...............................................................................5
1.1.3 BASES DE LAS TAREAS EN UN COMPILADOR..................................................5
1.1.4. OPTIMIZACIN EN LA COMPILACIN.............................................................6
1.1.5 COMPILACIN EN LA ACTUALIDAD.................................................................6
1.2. CONCEPTOS BSICOS...................................................................................... 7
1.3. CONCEPTO DE COMPILADOR............................................................................8
1.4. INTERPRETAR VS COMPILAR.............................................................................8
1.4.1. VENTAJAS DE COMPILAR FRENTE A INTERPRETAR:........................................9
1.4.2. VENTAJAS DEL INTRPRETE FRENTE AL COMPILADOR:..................................9
1.5. TIPOS DE COMPILADORES.............................................................................. 10
1.6. ESTRUCTURA DE UN COMPILADOR................................................................12
1.6.1. PREPROCESADOR........................................................................................ 12
1.6.2COMPILACIN................................................................................................ 13
1.6.3. ENSAMBLADO............................................................................................. 13
1.6.4. ENLAZADO.................................................................................................. 14
1.7.1 FASE DE ANLISIS........................................................................................ 15
1.7.2. FASE DE SNTESIS........................................................................................ 16
1.8 EJEMPLO DEL PROCESO DE COMPILACIN......................................................17
1.9. HERRAMIENTAS PARA CONSTRUCCIN DE COMPILADORES...........................19
1.10. EL LENGUAJE Y LA HERRAMIENTA.................................................................19
1.11.ASPECTOS ACADMICOS Y DE INVESTIGACIN DE COMPILADORES.............20
TEMA II: ANLISIS LXICO..................................................................................... 21
2.1. ANLISIS LXICO (SCANNER).........................................................................21
2.2. EL PROCESO DEL ANLISIS LXICO................................................................21
2.3.QUE ES UN ANALIZADOR LXICO?.................................................................21
2.4. FUNCIONES DEL ANALIZADOR LXICO...........................................................22
2.5. NECESIDAD DEL ANALIZADOR LXICO...........................................................23
2.6. VENTAJAS DE SEPARAR EL ANLISIS LXICO Y EL ANLISISSINTCTICO.........23
2.7. COMPONENTES LXICOS, PATRONES, LEXEMAS.............................................23
2.7.1.COMPONENTE LXICO O TOKEN...................................................................23

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
2.7.2. PATRN O EXPRESIN REGULAR.................................................................24
2.7.3.LEXEMA........................................................................................................ 24
2.8. DESCRIPCIN DE UN ANALIZADOR LXICO....................................................24
TEMA III GRAMATICA.............................................................................................. 26
3.1 GRAMTICAS................................................................................................ 26
3.2 AMBIGEDAD.................................................................................................. 27
TEMA IV ANALISIS SINTCTICO.............................................................................29
4.1 QU ES EL ANALIZADOR SINTCTICO?..........................................................29
4.2 MANEJO DE ERRORES SINTCTICOS................................................................30
4.3 TIPO DE GRAMTICA QUE ACEPTA UN ANALIZADOR SINTCTICO....................31
4.4 RBOL SINTCTICO DE UNA SENTENCIA DE UN LENGUAJE.............................33
4.5 AMBIGEDAD:................................................................................................. 33
4.6 TIPOS DE ANLISIS.......................................................................................... 34
4.7ANLISIS DESCENDENTE CON RETROCESO......................................................34
4.8 ANLISIS ASCENDENTE CON RETROCESO.......................................................36
TEMA V FASE DE SNTESIS..................................................................................... 37
5.1 FASE DE SNTESIS............................................................................................ 37
5.2 EN LA FASE DE ANLISIS SE ENCUENTRAN:....................................................37
5.2.1 Anlisis Lxico:............................................................................................. 37
5.2.2 Anlisis Sintctico:....................................................................................... 37
5.2.3 Anlisis Semntico:...................................................................................... 37
5.2.4 Generacin de cdigo intermedio:...............................................................38
5.3 Optimizacin:.................................................................................................. 38
5.4 Generacin de cdigo objeto:........................................................................38
TEMA VI TABLA DE SMBOLOS Y MANEJO DE MEMORIA.........................................39
6.1 TABLA: CONJUNTO DE PARES CLAVE-VALOR, LLAMADOS ELEMENTOS DE LA
TABLA.................................................................................................................... 39
6.2 TABLAS DE SMBOLOS (IDENTIFICADORES).....................................................40
6.3 TABLAS NO ORDENADAS................................................................................. 40
6.4 TABLAS ORDENADAS....................................................................................... 40
6.5 TABLAS EN RBOL BINARIO.............................................................................41
6.6 TABLAS DE ACCESO DIRECTO.........................................................................41
6.7 TABLAS HASH O DE ENTRADA CALCULADA.....................................................41
6.8 TABLAS HASH ABIERTAS (CON REHASH).........................................................42
6.9 ASIGNACON DE MEMORIA.............................................................................. 42

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
6.10 ASIGNACIN ESTTICA.................................................................................. 42
CONCLUSIN......................................................................................................... 44
BIBLIOGRAFA........................................................................................................ 45

ndice de ilustraciones (Imgenes)


Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin
Ilustracin

1............................................................................................................ 7
2.......................................................................................................... 10
3.......................................................................................................... 12
4.......................................................................................................... 13
5.......................................................................................................... 13
6.......................................................................................................... 14
7.......................................................................................................... 14
8.......................................................................................................... 15
9.......................................................................................................... 17
10........................................................................................................ 18
11........................................................................................................ 19
12........................................................................................................ 20
13........................................................................................................ 21
14........................................................................................................ 22
15........................................................................................................ 25
16........................................................................................................ 25
17........................................................................................................ 33
18........................................................................................................ 34
19........................................................................................................ 35
20........................................................................................................ 38

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

INTRODUCCIN
En esta antologa veremos de forma general que es un compilador, las fases que se
pueden dividir compiladores y lo que consta cada una de ellas, ya que tienen
diferentes funcionalidades. Los nombres que reciben estas fases; veremos cmo se
traduce de un L. Fuente a un L. Objeto dando definiciones de cada una de las fases,
como se llegaran a implementar en compiladores. Como se divide un compilador, ya
que en esta parte al ubicar donde se divide sabrs cuales de las fases sirve para
cada una de ellas, etc. En general conceptos de compiladores y sus respectivas
definiciones dcada una de ellas.
En un mundo informatizado como en el que vivimos, en el que cada da que pasa
dependemos ms y ms de un sistema informtico eficiente, el cual debe estar
preparado para brindarnos la ms alta calidad de servicios y prestaciones. Adems
de ser sencillo en su manejo y sobre todo confiable, siendo estas caractersticas
indispensables para el usuario final. Quien no se fija, ni pregunta cmo se realiza
determinada tarea, pero si es buen critico a la hora de ver resultados, pero hay otros
que contrarios a estos, se hace la pregunta del milln, "Cmo se logra hacer tal y tal
cosa? ,"Cmo es posible que un graficado trabaje tan rpido?, Cmo es posible
que un procesador de palabra a la hora de usar un diccionario sea tan eficiente?,
Cmo es posible llevar los resultados de una aplicacin a otra?, o Cmo es
posible que un programa que fue creado por una empresa puede trabajar con los
datos de obtenidos de otro programa, echo por otra empresa?. Muchas pueden ser
las respuestas, algunos argumentaran que es el sistema operativo, otros dirn que
son las normas y estndares establecidos, otros dirn irnicamente que es ms
sencillo de lo que se piensa, dirn que se hace clac con la rata aqu, se arrastra y se
lleva a donde se quiere. Todos ellos tienen razn, sin embargo si indagamos ms a
fondo. Surgirn preguntas ms directas como por ejemplo "Cmo se logra tal
velocidad, con tan buen manejo de grfico?", claro que a todas ellas se puede
responder diciendo, que todo se logra gracias al Hardware, y no estaramos
totalmente errados, porque un buen Hardware conlleva un buen resultado, a una
buena calidad de impresin en caso de volcado al papel, una buena imagen si
hablamos de grficos, o un buen tiempo de respuesta a la hora de realizar algn
clculo matemtico, pero siempre el Hardware ser una parte, solo una parte.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

TEMA I GENERALIDADES
1.1.1. (HISTORIA)
En 1946 se desarroll el primer ordenador digital. En un principio, estas mquinas
ejecutaban instrucciones que consistan en cdigos numricos que sealan a los
circuitos de la mquina los estados correspondientes a cada operacin. Pronto los
primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus
programas mediante claves ms fciles de recordar que esos cdigos numricos; al
final, todas esas claves juntas se traducan manualmente a Lenguaje Mquina. Estas
claves constituyen los llamados lenguajes ensambladores, que se generalizaron en
cuanto se dio el paso decisivo de hacer que las propias mquinas realizarn el
proceso mecnico de la traduccin. A este trabajo se le llama ensamblar el programa.
Las instrucciones de los lenguajes ensambladores obligan a programar cualquier
funcin de una manera minuciosa e iterativa. A pesar de ello, el lenguaje
ensamblador segua siendo el de una mquina, pero ms fcil de manejar. Los
trabajos de investigacin se orientaron entonces hacia la creacin de un lenguaje
que expresara las distintas acciones a realizar de una manera lo ms sencilla posible
para el hombre. As, en 1950, desarrollaron el FORTRAN con el cual surgi as
por primera vez el concepto de un traductor (como un programa que traduca un
lenguaje a otro lenguaje). En el caso particular de que el lenguaje a traducir es
un lenguaje de alto nivel y el lenguaje traducido de bajo nivel, se emplea el trmino
compilador.

1.1.2 INICIO DEL COMPILADOR


La tarea de realizar un compilador no fue fcil. El primer compilador de FORTRAN
tard 18 aos en realizarse y era muy sencillo. El FORTRAN estaba muy
influenciado por la mquina objeto en la que iba a ser implementado. Como un
ejemplo de ello tenemos el hecho de que los espacios en blanco fuesen ignorados,
debido a que el perifrico que se utilizaba como entrada de programas (una lectora
de tarjetas perforadas) no contaba correctamente los espacios en blanco.

1.1.3 BASES DE LAS TAREAS EN UN COMPILADOR


En los aos 1958 y 1959 se van poniendo las bases para la divisin de tareas en un
compilador. As, en 1959 se propone el empleo de autmatas deterministas y no
deterministas para el reconocimiento lexicogrfico de los lenguajes. Rpidamente se
aprecia que la construccin de analizadores lxicos a partir de expresiones regulares
es muy til en la implementacin de los compiladores. En 1975 surge el concepto de
un generador automtico de analizadores lxicos a partir de expresiones regulares,
basado en el sistema operativo UNIX.A partir de los trabajos de Chomsky ya citados,

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
se produce una sistematizacin dela sintaxis de los lenguajes de programacin, y
con ello un desarrollo de diversos mtodos de anlisis sintctico.
Con la aparicin de la notacin BNF, se tiene una gua para el desarrollo del anlisis
sintctico.

1959: Se describe un mtodo de parsing de FORTRAN que introduca


parntesis adicionales alrededor de los operados para ser capaz de analizar
lasexpresiones.
1960: Se desarrollan los diversos mtodos de parsers ascendentes y
descendentes
1961: Se realiza el uso por primera vez de un parsing descendente recursivo.
1965: Se define las gramticas LR y describe la construccin de una tabla
cannica de parser LR.
1968: Se estudian y definen las gramticas LL as como los parsers
predictivos
1970: Se describen los mtodos SLR y LALR de pares LR. Debido a su
sencillez y a su capacidad de anlisis para una gran variedad de lenguajes, la
tcnica de parsing LR va a ser la elegida para los generadores automticos de
parsers.
1975: Se crea el generador de analizadores sintcticos YACC para funcionar
bajo un entorno UNIX Junto al anlisis sintctico, tambin se fue desarrollando
el anlisis semntico.

1.1.4. OPTIMIZACIN EN LA COMPILACIN


La tcnica de la optimizacin apareci desde el desarrollo del primer compilador de
FORTRAN. Backus comenta cmo durante el desarrollo del FORTRAN se tena el
miedo de que el programa resultante de la compilacin fuera ms lento que si se
hubiera escrito a mano. Para evitar esto, se introdujeron algunas optimizaciones en
el clculo de los ndices dentro de un bucle. Pronto se sistematizan y se recoge la
divisin de optimizaciones independientes de la mquina y dependientes de la
mquina.

Entre las primeras estn la propagacin de valores, el arreglo de expresiones,


la eliminacin de redundancias, etc.
Entre las segundas se podra encontrar la localizacin de registros, el uso de
instrucciones propias de la mquina y el reordenamiento de cdigo. A partir de
1970 comienza el estudio sistemtico de las tcnicas del anlisis de flujo de
datos. Su repercusin ha sido enorme en las tcnicas de optimizacin global
de un programa.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

1.1.5 COMPILACIN EN LA ACTUALIDAD


En la actualidad, el proceso de la compilacin ya est muy asentado. Un compilador
es una herramienta bien conocida, dividida en diversas fases. Algunas de estas fases
se pueden generar automticamente (analizador lxico y sintctico) y otras requieren
una mayor atencin por parte del escritor de compiladores (las partes de traduccin y
generacin de cdigo).De todas formas, y en contra de lo que quiz pueda pensarse,
todava se estn llevando a cabo varias vas de investigacin en este fascinante
campo de la compilacin:

Por una parte, se estn mejorando las diversas herramientas disponibles (por
ejemplo, el generador de analizadores lxicos Aardvark para el lenguaje
PASCAL).
Tambin la aparicin de nuevas generaciones de lenguajes -ya se habla de la
quinta generacin, como de un lenguaje cercano al de los humanos-ha
provocado la revisin y optimizacin de cada una de las fases del compilador.

El ltimo lenguaje de programacin de amplia aceptacin que se ha diseado, el


lenguaje Java, establece que el compilador no genera cdigo para una mquina
determinada sino para una virtual, la Java Virtual Machine (JVM), que posteriormente
ser ejecutado por un intrprete, normalmente incluido en un navegador de Internet.

1.2.

CONCEPTOS

BSICOS

Traductor

Cunduacn Tab. Viernes 28 de noviembre de 2014

Ilustracin 1

45

Compiladores
.Cualquier programa que toma como entrada un texto escrito en un lenguaje llamado
fuente y da como salida un programa equivalente en otro lenguaje, el lenguaje
objeto. Si el lenguaje fuente de un lenguaje de programacin de alto nivel y el objeto
un lenguaje de bajo nivel (ensamblador o cdigo de mquina), al traductor se le
denomina
Compilador

Ensamblador.

Es un programa traductor cuyo lenguaje fuente es el lenguaje ensamblador

Intrprete.

Es un programa que no genera un programa equivalente, sino que toma una


sentencia del programa fuente en un lenguaje de alto nivel y la traduce al cdigo
equivalente y al mismo tiempo lo ejecuta. En un principio debido a la escasez de
memoria se utilizaban ms los intrpretes, ahora se usan ms los compiladores (a
excepcin de JAVA)

1.3. CONCEPTO DE COMPILADOR


En el caso de que el lenguaje fuente sea un lenguaje de programacin de alto nively
el objeto sea un lenguaje de bajo nivel (ensamblador o cdigo de mquina), adicho
traductor se le denomina compilador. Un ensamblador es un compilador cuyo
lenguaje fuente es el lenguaje ensamblador. Histricamente, con la escasez de
memoria de los primeros ordenadores, se puso de moda el uso de intrpretes frente
a los compiladores, pues el programa fuente sin traducir y el intrprete juntos daban
una ocupacin de memoria menor que la resultante de los compiladores. Por ello los
primeros ordenadores personales iban siempre acompaados de un intrprete de
BASIC (Septum, Comodoro VIC-20, PC XT de IBM, etc.).La mejor informacin sobre
los errores por parte del compilador as como una mayor velocidad de ejecucin del
cdigo resultante hizo que poco a poco se impusieran los compiladores. Hoy en da,
y con el problema de la memoria prcticamente resuelto, se puede hablar de un gran
predominio de los compiladores frente a los intrpretes, aunque intrpretes como los
incluidos en los navegadores de Internet para interpretar el cdigo JVM de Java son
la gran excepcin. La razn principal para querer usar un compilador es querer
traducir un programa de un lenguaje de alto nivel, a otro lenguaje de nivel inferior
(tpicamente lenguaje). De esta manera un programador puede disear un programa
en un lenguaje mucho ms cercano a cmo piensa un ser humano, para luego
compilarlo a un programa ms manejable por una computadora.

1.4. INTERPRETAR VS COMPILAR


Hay dos maneras de ejecutar un programa escrito en un lenguaje de alto nivel
Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Compilacin:

Traducir todo el programa a otro programa equivalente en cdigo mquina. Entonces


se ejecuta el programa obtenido

Interpretacin:

Interpretar las instrucciones del programa escrito en lenguaje de alto nivel y


ejecutarla una por una.

1.4.1. VENTAJAS DE COMPILAR FRENTE A INTERPRETAR:

Se compila una vez, se ejecuta n veces.


En bucles, la compilacin genera cdigo equivalente al bucle, pero
interpretndolo se traduce tantas veces una lnea como veces se repite el
bucle.
El compilador tiene una visin global del programa, por lo que la informacin
de mensajes de error es ms detallada.

1.4.2. VENTAJAS DEL INTRPRETE FRENTE AL


COMPILADOR:

Un intrprete necesita menos memoria que un compilador. En principio eran


ms abundantes dado que los ordenadores tenan poca memoria.
Permiten una mayor interactividad con el cdigo en tiempo de desarrollo. Un
compilador no es un programa que funciona de manera aislada, sino que
necesita de otros programas para conseguir su objetivo: obtener un programa
ejecutable a partir de un programa fuente en un lenguaje de alto nivel. Algunos
deseos programas son el preprocesador, el linker, el depurador y el
ensamblador.
El preprocesador
Se ocupa (dependiendo del lenguaje) de incluir ficheros, expandir
macros, eliminar comentarios, y otras tareas similares.
El linker (Enlazador)
Se encarga de construir el fichero ejecutable aadiendo al fichero
objeto generado por el compilador las cabeceras necesarias y las
funciones de librera utilizadas por el programa fuente.
El depurador
Permite, si el compilador ha generado adecuadamente el programa
objeto, seguir paso a paso la ejecucin de un programa. Finalmente,
Muchos compiladores, en vez de generar cdigo objeto, generan un
programa en lenguaje ensamblador que debe despus convertirse en
un ejecutable mediante un programa ensamblador

.
Cunduacn Tab. Viernes 28 de noviembre de 2014
Ilustracin
2

45

Compiladores

1.5. TIPOS
DE

COMPILADORES
El programa compilador
un lenguaje de alto nivel
computadora
puede
cada

traduce las instrucciones en


a instrucciones que la
interpretar y ejecutar. Para

lenguaje
de
programacin
se
requiere
un
compilador
separado.
El
compilador
traduce todo el
programa antes
de ejecutarlo. Los compiladores son, pues, programas de traduccin insertada en la
memoria por el sistema operativo para convertir programas de cmputo en
pulsaciones electrnicas ejecutables (lenguaje de mquina). Los compiladores
pueden ser de:
Una sola pasada: examina el cdigo fuente una vez, generando el
cdigo o programa objeto.
pasadas mltiples: requieren pasos intermedios para producir un
cdigo en otro lenguaje, y una pasada final para producir y optimizar el
cdigo producido durante los pasos anteriores.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
Optimacin: lee un cdigo fuente, lo analiza y descubre errores
potenciales sin ejecutar el programa.
Compiladores incrementales: generan un cdigo objeto instruccin
por instruccin (en vez de hacerlo para todo el programa) cuando el
usuario teclea cada orden individual. El otro tipo de compiladores
requiere que todos los enunciados o instrucciones se compilen
conjuntamente.
Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee
una estructura sencilla.
Compilador cruzado: se genera cdigo en lenguaje objeto para una
mquina diferente de la que se est utilizando para compilar. Es
perfectamente normal construir un compilador de Pascal que genere
cdigo para MS-DOS y que el compilador funcione en Linux y se haya
escrito en C++.
Compilador con montador: compilador que compila distintos mdulos
de forma independiente y despus es capaz de enlazarlos.
Auto compilador: compilador que est escrito en el mismo lenguaje
que va a compilar. Evidentemente, no se puede ejecutar la primera vez.
Sirve para hacer ampliaciones al lenguaje, mejorar el cdigo generado,
etc.
Meta compilador es sinnimo de compilador de compiladores y se
refiere a un programa que recibe como entrada las especificaciones del
lenguaje para el
Descompilador: es un programa que acepta como entrada cdigo
mquina y lo traduce a un lenguaje de alto nivel, realizando el proceso
inverso a la compilacin. Esta taxonoma de los tipos de compiladores
no es excluyente, por lo que puede haber compiladores que se
adscriban a varias categoras:
Compiladores cruzados: generan cdigo para un sistema distinto del
que estn funcionando.
Compiladores optimizadores: realizan cambios en el cdigo para
mejorar su eficiencia, pero manteniendo la funcionalidad del programa
original.
Compiladores de una sola pasada: Generan el cdigo mquina a
partir de una nica lectura del cdigo fuente.
Compiladores de varias pasadas: necesitan leer el cdigo fuente
varias veces antes de poder producir el cdigo mquina.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

1.6. ESTRUCTURA DE UN COMPILADOR.


Cualquier compilador debe realizar dos tareas principales: anlisis del programa a
compilar y sntesis de un programa en lenguaje mquina que, cuando se ejecute,
realizara correctamente las actividades descritas en el programa fuente. Para el
estudio de un compilador, es necesario dividir su trabajo en fases. Cada fase
representa una transformacin al cdigo fuente para obtener el cdigo objeto. La
siguiente figura representa los componentes en que se divide un compilador. Las tres
primeras fases realizan la tarea de anlisis, y las dems la sntesis. En cada una de
las fases se utiliza un administrador de la tabla de smbolos y un manejador de
errores.

Ilustracin 3

1.6.1. PREPROCESADOR
Es el encargado de transformar el cdigo fuente de entrada original en el cdigo
fuente puro. Es decir en expandir las macros, incluir las libreras, realizar un
preprocesador racional (capacidad de enriquecer a un lenguaje antiguo con recursos
ms modernos), extender el lenguaje y todo aquello Que en el cdigo de entrada sea
representativo de una abreviatura para facilitar la escritura del mismo.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Ilustracin 4

1.6.2COMPILACIN
Recibe el cdigo fuente puro, este es el modulo principal de un compilador, pues si
ocurriera algn error en esta etapa el compilador no podra avanzar. Enasta etapa se
somete al cdigo fuente puro de entrada a un anlisis lexicogrfico, a un anlisis
sintctico, a un anlisis semntico, que construyen la tabla de smbolos, se genera
un cdigo intermedio al cual se optimiza para as poder producir un cdigo de salida
generalmente en algn lenguaje ensamblador

Ilustracin 5

1.6.3.

ENSAMBLADO

Este mdulo no es ni ms ni menos que otro compilador pues recibe un cdigo


fuente de entrada escrito en ensamblador, y produce otro cdigo de salida, llamado
cdigo binario no enlazado. Si por un momento viramos a este mdulo como un
programa independiente, veramos que en este caso los trminos programa
compilador y proceso de compilacin son los mismos. Pues este mdulo no es ms
que un compilador, que en su interior realiza como su antecesor un anlisis lxico
grfico, un anlisis sintctico, un anlisis semntico, crea una tabla de smbolos,
genera un cdigo intermedio lo optimiza y produce un cdigo de salida llamado
cdigo binario no enlazado, ya todo este conjunto de tares se los denomina proceso
de compilacin. Conoce puede ver este compilador (llamado ensamblador) a
diferencia de los dems compiladores no realiza una expansin del cdigo fuente
original (cdigo fuente de entrada), tiene solamente un proceso de compilacin y por
supuesto no enlaza el cdigo fuente. Es un compilador que carece de los mdulos de
preprocesador y enlazado, y donde los mdulos de compilacin y ensamblado son
los mismos

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Ilustracin 6

1.6.4. ENLAZADO
El cuarto y ltimo modulo es el encargado de realizar el enlazado del cdigo de
fuente de entrada (cdigo maquina relocalizarle) con las libreras que necesita, como
as tambin de proveer al cdigo de las rutinas necesarias para poder ejecutarse y
cargarse a la hora de llamarlo para su ejecucin, modifcalas direcciones
relocalizarles y ubica los datos en las posiciones apropiadas dela memoria. Este
ltimo modulo es el que produce como salida el cdigo binario enlazado. Ya sea
dinmico o esttico, al decir dinmico se refiere a que el cdigo producido utiliza
libreras dinmicas (libreras ya cargadas en el sistema), esto implica que se
obtendr un cdigo ms corto y que reactualizara automticamente si aparece
alguna nueva versin de las libreras, mientras que el esttico se refiere al echo que
no se realiza enlace con ninguna librera y por lo tanto se obtendr un cdigo ms
largo con una copia de las rutinas de librera que necesita.

Ilustracin 7

Analizando en detalle el proceso de compilacin, se divide en dos grandes fases:

Cunduacn Tab. Viernes 28 de noviembre de 2014


Ilustracin
8

45

Compiladores
Fase de Anlisis
Anlisis Lxico

Anlisis Sintctico
Anlisis Semntico
Fase de Sntesis
Etapa de Generacin de Cdigo Intermedio
Etapa de Optimizacin de Cdigo
Etapa de Generacin de Cdigo

1.7.1 FASE DE ANLISIS


En esta fase se crea una representacin intermedia de cdigo
Anlisis lxico (scanner).
En la fase de anlisis lxico se leen los caracteres del programa fuente y se agrupan
en cadenas que representan los componentes lxicos. Cada componente lxico es
una secuencia lgicamente coherente de caracteres relativa a un identificador, una
palabra reservada, un operador o un carcter de puntuacin. A la secuencia de
caracteres que representa un componente lxico se le llama lexema (o con su
nombre en ingls token).En el caso de los identificadores creados por el programador
no solo se genera un componente lxico, sino que se genera otro lexema en la tabla
de smbolos.
Anlisis sintctico (parser).
En esta fase, los componentes lxicos se agrupan en frases gramaticales qu el
compilador utiliza para sintetizar la salida.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
Anlisis semntico.
La fase de anlisis semntico se intenta detectar instrucciones que tnganla
estructura sintctica correcta, pero que no tengan significado para la operacin
implicada.

1.7.2. FASE DE SNTESIS


Genera un cdigo a partir de la representacin intermedia
Generacin de cdigo intermedio.
Algunos compiladores generan una representacin intermedia explcita del programa
fuente, una vez que se han realizado las fases de anlisis. Se puede considerar esta
operacin intermedia como un subprograma para una mquina abstracta. Esta
representacin intermedia debe tener dos propiedades importantes: debe ser fcil de
producir y fcil de traducir al programa objeto.
Optimizacin de cdigo.
En esta fase se trata de mejorar el cdigo intermedio, de modo que resulten cdigo
de mquina ms rpido de ejecutar.
Generacin de cdigo.
Esta constituye la fase final de un compilador. En ella se genera el cdigo objeto que
por lo general consiste en cdigo en lenguaje mquina (cdigo relocalizable) o
cdigo en lenguaje ensamblador. Adems existen:
Administrador de la tabla de smbolos.
Una tabla de smbolos es una estructura de datos que contiene un registro por cada
identificador. El registro incluye los campos para los atributos del identificador. El
administrador de la tabla de smbolos se encarga de manejar los accesos a la tabla
de smbolos, en cada una de las etapas de compilacin de un programa.
Manejador de errores.
En cada fase del proceso de compilacin es posibles encontrar errores. Es
conveniente que el tratamiento de los errores se haga de manera centralizada a
travs de un manejador de errores. De esta forma podrn controlarse ms
eficientemente los errores encontrados en cada una de las fases de la compilacin
de un programa.

1.8 EJEMPLO DEL PROCESO DE COMPILACIN


Supongamos que un compilador tiene que analizar la siguiente preposicin:
Suma= var1 + var2 + 10
Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
Anlisis Lxico
El analizador lxico lee los caracteres del programa fuente, y verifica que
correspondan a una secuencia lgica (identificador, palabra reservada etc.). Estas
secuencia de caracteres reciben el nombre componente lxico o lexema. En este
caso el analizador lxico verifica si el identificador id1 (nombre interno para "suma")
encontrado se halla en la tabla de smbolos, si no est produce un error porque
todava no fue declarado, si la preposicin hubiese sido la declaracin del
identificador "suma" en lenguajes C, C++ (int suma;) el analizador lxico agregara un
identificador en la tabla de smbolos, y as sucesivamente con todos los
componentes lxicos que aparezcan, los componentes lxicos resultantes de la
expresin son:
Identificador:

suma.

El smbolo de asignacin: =
Identificador: var1
Operador: +
Identificador: var2
Operador: +
Numero: 10
Que en el anlisis lxico y con la tabla de smbolos es:
id1= id2+ id3 * 10
Anlisis Sintctico
El analizador sintctico impone una estructura jerrquica a la cadena de
componentes lxicos, generada por el analizador lxico, que es representada en
forma de un rbol sintctico.

Ilustracin
9

Anlisis Semntico
El analizador semntico verificara en este caso que cada operador tenga los
operados permitidos
Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Ilustracin
10

Anlisis Semntico
El analizador semntico verificara en este caso que cada operador tenga los
operados permitidos.=/ \id1 +/ \id2 +/ \id3 tipo_ent|10
Generador de cdigo intermedio
En esta etapa se lleva la preposicin a una representacin intermedia como
un programa para una maquina abstracta.
temp1= tipo_ent(10)
temp2= id3 * temp1
temp3= id2 + tem2
id1= temp3
Optimizacin de cdigo
El cdigo intermedio obtenido es representado de una forma ms optima y eficiente.
temp1= id3 * 10.0
id1= id2 + temp1
Generador de cdigo
Finalmente lleva el cdigo intermedio a un cdigo objeto que en este caso es un
cdigo relocalizable o cdigo ensamblador (tambin llamado cdigo no enlazado).
MOVF id3, R2
MULT #10.0, R2

1.9. HERRAMIENTAS PARA CONSTRUCCIN DE


COMPILADORES
Sistema de ayuda para escribir compiladores
Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
Generadores de compiladores
Sist. Generadores de traductores
Herramientas generales para el diseo automtico de
componentes especficos de un comp.
Utilizan lenguajes especficos para especificar e implementar la componente
Ocultan detalles del algoritmo de generacin
Producen componentes que se pueden integrar al resto del compilador
Generadores de analizadores sintcticos
Producen AS a partir de una Gramtica Libre de Contexto
Hoy esta es una de las fases ms fciles de aplicar
Generadores de analizadores lxicos
Producen AL a partir de una especificacin en Expresiones Regulares.
El AL resultante es un Autmata Finito
Dispositivos de traduccin dirigida por la sintaxis
Producen grupos de rutinas que recorren el rbol de AS generando cdigo
intermedio
Generadores automticos de cdigo
Las proposiciones en cod. Int. se reemplazan por plantillas que representan
secuencia de instrucciones de mquina
Dispositivos para anlisis de flujo de datos
Inf. sobre como los valores se transmiten de una parte a otra del programa
LEX y YACC
Herramientas que nos permiten desarrollar componentes o la mayor parte de
un compilador
Son un recurso invaluable para el profesional y el investigador
Existen paquetes freeware

1.10. EL LENGUAJE Y LA HERRAMIENTA

Ilustracin 11

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

1.11.ASPECTOS ACADMICOS Y DE INVESTIGACIN DE


COMPILADORES

Ilustracin 12

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

TEMA II: ANLISIS LXICO


2.1. ANLISIS LXICO (SCANNER)
El analizador lxico, tambin conocido como scanner, lee los caracteres uno a uno
desde la entrada y va formando grupos de caracteres con alguna relacin entre s
(tokens), que constituirn la entrada para la siguiente etapa del compilador. Cada
token representa una secuencia de caracteres que son tratados como una nica
entidad. Por ejemplo, en Pascal un token es la palabra reservada BEGIN, en
C:WHILE, etc. Las tiras especficas slo tienen tipo (lo que representan), mientras
que las tiras no especficas tienen tipo y valor. Por ejemplo, si Contador es un
identificador, el tipo de token ser identificador y su valor ser la cadena Contador.
El Analizador Lxico es la etapa del compilador que va a permitir saber si es un
lenguaje de formato libre o no. Frecuentemente va unido al analizador sintctico en la
misma pasada, funcionando entonces como una subrutina de este ltimo. Ya que es
el que va leyendo los caracteres del programa, ignorar aquellos elementos sin
necesarios para la siguiente fase, como los tabuladores, comentarios, espacios
en blanco, etc.

2.2. EL PROCESO DEL ANLISIS LXICO


El proceso de anlisis lxico se refiere al trabajo que realiza el scanner con relacin
al proceso de compilacin. El scanner representa una interfaz entre el programa
fuente y el analizador sintctico o parser. El scanner, a travs del examen carcter
por carcter del texto, separa el programa fuente en piezas llamadas tokens, los
cuales representan los nombres de las variables, operadores, etiquetas, y todo lo que
comprende el programa fuente. El par ser, usualmente genera un rbol de sintaxis
del programa fuente como ha sido definido por una gramtica. Las hojas del rbol
son smbolos terminales de la gramtica. Son esos smbolos terminales o tokens los
que el scanner extrae del cdigo fuente y se los pasa al parser.

2.3.QUE ES UN ANALIZADOR LXICO?


Se encarga de buscar los componentes lxicos (
En ingles) o palabras que componen el programa fuente, segn unas reglas o
patrones. La entrada del analizador lxico podemos definirla como una secuencia de
caracteres.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

El
analizador
lxico tiene que
dividir
la
secuencia de caracteres en palabras con significado propio y despus convertirlo a
una secuencia de terminales desde el punto de vista del analizador sintctico, que Ilustracin 13
es la entrada del analizador sintctico

2.4. FUNCIONES DEL ANALIZADOR LXICO


El analizador lxico es la primera fase de un compilador. Su principal funcin consiste
en leer los caracteres de entrada y elaborar como salida una secuencia de
componentes lxicos que utiliza el analizador sintctico para hacer el anlisis. Esta
interaccin, suele aplicarse convirtiendo al analizador lxico en una subrutina
ocorrutina del analizador sintctico. Recibida la orden Dame el siguiente
componente lxico del analizador sintctico, el analizador lxico lee los caracteres
de entrada hasta que pueda identificar el siguiente componente lxico. Estos
componentes lxicos representan:
palabras reservadas: if, while, do, . . .
Identicadores: asociados a variables, nombres de funciones, tipos definidos
por el usuario, etiquetas,... Por ejemplo:
Forma: una letra seguida de letras o nmeros. Ej. a, b1, c3D
Atributo nombre: string con la secuencia de caracteres que forma el
identificador en maysculas. Ej. A, B1, C3D
operadores: = * + - / == > < &! = . . .
smbolos especiales ; ( ) [ ] f g ...
Constantes numricas: literales que representan valores enteros, en coma
flotante, etc, 982, 0xF678, -83.2E+2,...
Forma: secuencia de dgitos que puede empezar con el signo menos y puede
contener un punto. Ej. 10, -3, 15.4, -54.276, .10
Atributo valor: Double con el valor numrico.
Precisin: entero o real.
constantes de caracteres: literales que representan cadenas concretas de
caracteres, \hola mundo",...

Ilustracin 14

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
Otras

funciones
que realiza:
Eliminar los comentarios del programa.
Eliminar espacios en blanco, tabuladores, retorno de carro, etc, y en general,
todo aquello que carezca de significado segn la sintaxis del lenguaje.
Reconocer los identificadores de usuario, nmeros, palabras reservadas del
lenguaje,..., y tratarlos correctamente con respecto a la tabla de smbolos (solo
en los casos que debe de tratar con la tabla de smbolos).
Llevar la cuenta del nmero de lnea por la que va leyendo, por si se produce
algn error, dar informacin sobre donde se ha producido.
Avisar de errores lxicos. Por ejemplo, si @ no pertenece al lenguaje, avisar
de un error.
Puede hacer funciones de preprocesador.

2.5. NECESIDAD DEL ANALIZADOR LXICO


Un tema importante es por qu se separan los dos anlisis lexicogrficos y
sintcticos, en vez de realizar slo el anlisis sintctico, del programa fuente, cosa
perfectamente posible aunque no plausible. Algunas razones de esta separacin son:
Un diseo sencillo es quizs la consideracin ms importante. Separar el
anlisis lxico del anlisis sintctico a menudo permite simplificar una u otra
de dichas fases. El analizador lxico nos permite simplificar el analizador
sintctico.

2.6. VENTAJAS DE SEPARAR EL ANLISIS LXICO Y EL


ANLISISSINTCTICO:
Facilita transpirabilidad del traductor (por ejemplo, si decidimos en un
momento dado cambiar las palabras reservadas begin y end de inicio y en de
bloque, por f y g, solo hay que cambiar este mdulo.
Se simplifica el diseo: el analizador es un objeto con el que se interacta
mediante ciertos mtodos. Se localiza en un nico modulo la lectura fsica
delos caracteres, por lo que facilita tratamientos especializados de E/S.
Se mejora la eficiencia del compilador. Un analizador lxico independiente
permite construir un procesador especializado y potencialmente ms eficiente
para esa funcin.
Gran parte del tiempo se consume en leer el programa fuente y dividirlo en
componentes lxicos. Con tcnicas especializadas de manejo de buffers para

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
la lectura de caracteres de entrada y procesamiento de componentes lxicos
se puede mejorar significativamente el rendimiento de un compilador.
Otra razn por la que se separan los dos anlisis es para que el analizador
lxico se centre en el reconocimiento de componentes bsicos complejos.

2.7. COMPONENTES LXICOS, PATRONES, LEXEMAS


2.7.1.COMPONENTE LXICO O TOKEN
El valor asociado a una categora o unidad de lxico. Se representa como un nmero
entero o una constante de un byte. Ejemplo: el token de un identificador puede ser 1
o id (si id fue definida como 1).Los tokens son las unidades lxicas bsicas de igual
forma que las palabras y signos de puntuacin son las unidades bsicas de un
enunciado. Los tokens varan del lenguaje al lenguaje e incluso de compilador a
compilador para el mismo lenguaje, la eleccin de los tokens es tarea del diseador
del compilador. En la mayora de lenguajes tendremos tokens para:

palabras clave: IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;


operadores
identificadores
constantes (reales, enteras y de tipo carcter), strings de caracteres y signos
de puntuacin1.

Tipos de tokens:
tiras especficas, tales como palabras reservadas (if, while, begin,etc.), el
punto y coma, la asignacin, los operadores aritmticos o lgicos, etc.
tiras no especficas, como identificadores, constantes o etiquetas.
Prioridad de los tokens
Se da prioridad al token con el lexema ms largo: Si se lee >= y > se
reconoce el primero.
Si el mismo lexema se puede asociar a dos tokens, estos patrones estarn
definidos en un orden determinado.
Ejemplo:
While palabra reservada while
letra (letra | digito)* identificador
Si en la entrada aparece while, se elegir la palabra reservada por estar
primero.
Si estas especificaciones iniciales aparecieran en orden inverso, se
reconocera un token identificador.

2.7.2. PATRN O EXPRESIN REGULAR


Definen las reglas que permiten identificar los componentes lxicos o tokens.
Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

2.7.3.LEXEMA
Es cada secuencia de caracteres concreta que encaja con un patrn, es decir,
escomo una instancia de un patrn.
Ejm:
8, 23, 50 (son lexemas que encajan con el patrn ( 0 | 1 | 2 | ... | 9) + )Una vez
detectado que un grupo de caracteres coincide con un patrn, se ha detectado un
lexema.

2.8. DESCRIPCIN DE UN ANALIZADOR LXICO


El anlisis lxico es un anlisis de los caracteres:
Parte de stos y por medio de patrones reconoce los lexemas
Enva al analizador sintctico el componente lxico y sus atributos
Puede hacer tareas adicionales: eliminar blancos, control lneas

Ilustracin
15

Cunduacn Tab. Viernes 28 de noviembre de 2014

Ilustracin 16

45

Compiladores

TEMA III GRAMATICA


3.1 GRAMTICAS
La tarea de proveer una descripcin bien concisa y entendible de un lenguaje de
programacin es difcil pero esencial para el xito de un lenguaje.
Uno de los problemas en describir un lenguaje es la diversidad de gente que debe
comprender esas descripciones. Las personas que implementan obviamente deben
ser capaces de determinar cmo se forman las expresiones, sentencias y unidades
de programas y tambin el orden de ejecucin de los mismos. La dificultad del
trabajo que tiene esta gente (los implementadores) est determinado en parte por la
claridad y complejidad de las descripciones del lenguaje.
La sintaxis de un lenguaje de programacin describe la forma correcta en la cual las
sentencias, expresiones y unidades de programa se deben escribir, mientras que la
semntica denota el significado de esas sentencias, expresiones y unidades de
programa.
Por ejemplo la sintaxis de una sentencia Pascal if then es:
if <condicin> then <sentencia>
La semntica de esta sentencia es que si el valor actual de la condicin es
verdadero, se ejecutar <sentencia>.
Describir sintaxis es ms fcil que describir semntica, ya que existen notaciones
aceptadas universalmente para la descripcin de sintaxis y no as de semnticas.
En la definicin de un lenguaje de programacin la sintaxis usualmente se expresa
en BNF (Backus- Naur Form) y la semntica est expresada en lenguaje natural
(espaol, ingls, etc).

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
BNF es un ejemplo de un metalenguaje, es decir, un lenguaje usado para definir
otros lenguajes. Algol 60 fue el primer lenguaje que utiliz BNF para su descripcin
sintctica.
Una gramtica consiste de un conjunto de no-terminales, terminales y una serie de
reglas de produccin. Un no-terminal est definido en una regla de produccin,
mientras que un terminal es un smbolo del lenguaje que se est definiendo. En una
regla de produccin el no-terminal (que aparece en la parte izquierda) est definido
en trminos de una secuencia de no-terminales y terminales (que se encuentran en
la parte derecha)
Ejemplo:
<dgito>::= 0|1|2|3|4|5|6|7|8|9
<letra>::= a|b|c|x|y|z
<identificador>::=<letra>|<identificador><dgito>|<identificador> <letra>
En BNF, un no-terminal se escribe entre < >, el smbolo ::= significa se define como
y el smbolo | significa o.
Estas reglas definen <dgitos> como uno de los smbolos 0, 1 al 9; <letra> como una
letra minscula e <identificador> se define como una nica letra, un identificador
seguido de una letra o un identificador seguido de un dgito.
As, el identificador ab1 puede ser derivado de <identificador>como sigue:
Sintaxis y Semntica del Lenguaje

En cada etapa, el no-terminal de ms a la


izquierda es reemplazado por la parte
derecha de una de sus reglas de
produccin, la secuencia de terminales y
no-terminales producidos en cada etapa
en una derivacin se conoce como formas
sentnciales. La forma sentencia final
(que ya no contiene smbolos noterminales) se conoce como una
sentencia.
La estructura de una derivacin se muestra mejor en un rbol de derivacin.
El rbol de derivacin que muestra cmo ab1 de <identificador> es:

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

3.2 AMBIGEDAD
Un problema surge cuando se definen gramticas ambiguas. Esto es, una gramtica
que permite diferentes interpretaciones para la misma sentencia.
Ejemplo: Veamos la siguiente definicin para la sentencia condicional if
<sent-cond>::= if <condicin> then <sent>
| if <condicin> then <sent> else <sent>
<sent>::= <sent-cond> | begin <sent> end
La siguiente sentencia condicional tiene dos diferentes rboles de derivacin:
if <cond> then if <cond> then <sent> else <sent>
rbol 1
<sent-cond>
!
if <cond> then <sent>
|
<sent-cond>
|
if <cond> then <sent> else <sent>
Como hay dos interpretaciones, la gramtica es ambigua. Una solucin podra
ser que la
sentencia anterior se escriba:
if <cond> then

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
begin
if <cond> then <sent> else <sent>
end

if <cond> then
begin
if <cond> then <sent>
end
else
<sent>
Dependiendo de la interpretacin que se desee.
Otra solucin sera agregando un cierre del if (ya sea con un; o con un endif

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

TEMA IV ANALISIS SINTCTICO


Todo lenguaje de programacin tiene reglas que describen la estructura sintctica de
programas bien formados. En Pascal, por ejemplo, un programa se compone de
bloques, un bloque de proposiciones, una proposicin de expresiones, una expresin
de componentes lxicos, y as sucesivamente. Se puede describir la sintaxis de las
construcciones de los lenguajes de programacin por medio de gramticas de
contexto libre o notacin BNF ( Backus-Naur Form).
Las gramticas ofrecen ventajas significativas a los diseadores de lenguajes y a los
desarrolladores de compiladores.
Las gramticas son especificaciones sintcticas y precisas de lenguajes
de programacin.
A partir de una gramtica se puede generar automticamente un
analizador sintctico.
El proceso de construccin puede llevar a descubrir ambigedades.
Una gramtica proporciona una estructura a un lenguaje de
programacin, siendo ms fcil generar cdigo y detectar errores.
Es ms fcil ampliar/modificar el lenguaje si est descrito con una
gramtica.
La mayor parte de este tema est dedicada a los mtodos de anlisis sintctico de
uso tpico en compiladores. Primero se introducen los conceptos bsicos, despus
las tcnicas adecuadas para la aplicacin manual. Adems como los programas
pueden contener errores sintcticos, los mtodos de anlisis sintctico se pueden
ampliar para que se recuperen de los errores sintcticos ms frecuentes.

4.1 QU ES EL ANALIZADOR SINTCTICO?


Es la fase del analizador que se encarga de chequear el texto de entrada en base a
una gramtica dada. Y en caso de que el programa de entrada sea vlido, suministra
el rbol sintctico que lo reconoce.
En teora, se supone que la salida del analizador sintctico es alguna representacin
del rbol sintctico que reconoce la secuencia de tokens suministrada por el
analizador lxico.
En la prctica, el analizador sintctico tambin hace:
Acceder a la tabla de smbolos (para hacer parte del trabajo del
analizador semntico).
Chequeo de tipos (del analizador semntico).
Generar cdigo intermedio.
Generar errores cuando se producen.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
En definitiva, realiza casi todas las operaciones de la compilacin. Este mtodo de
trabajo da lugar a los mtodos de compilacin dirigidos por sintaxis.

4.2 MANEJO DE ERRORES SINTCTICOS


Si un compilador tuviera que procesar slo programas correctos, su diseo e
implantacin se simplificaran mucho. Pero los programadores a menudo escriben
programas incorrectos, y un buen compilador debera ayudar al programador a
identificar y localizar errores. Es ms, considerar desde el principio el manejo de
errores puede simplificar la estructura de un compilador y mejorar su respuesta a los
errores.
Los errores en la programacin pueden ser de los siguientes tipos:
Lxicos, producidos al escribir mal un identificador, una palabra clave o
un operador.
Sintcticos, por una expresin aritmtica o parntesis no equilibrados.
Semnticos, como un operador aplicado a un operando incompatible.
Lgicos, puede ser una llamada infinitamente recursiva.
El manejo de errores de sintaxis es el ms complicado desde el punto de vista de la
creacin de compiladores. Nos interesa que cuando el compilador encuentre un
error, se recupere y siga buscando errores. Por lo tanto el manejador de errores de
un analizador sintctico debe tener como objetivos:
Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su
localizacin.
Recuperarse del error, para poder seguir examinando la entrada.
No ralentizar significativamente la compilacin.
Un buen compilador debe hacerse siempre teniendo tambin en mente los errores
que se pueden producir; con ello se consigue:
Simplificar la estructura del compilador.
Mejorar la respuesta ante los errores.
Tenemos varias estrategias para corregir errores, una vez detectados:
Ignorar el problema (Panic mode ): Consiste en ignorar el resto de la
entrada hasta llegar a una condicin de seguridad. Una condicin tal se
produce cuando nos encontramos un token especial (por ejemplo un ;
o un END).A partir de este punto se sigue analizando normalmente.
Ejemplo:
aux = a[i]
a[i] = a[j];
a[j] = aux;
Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Error
id = id [ id ] id [ id ] = id [ id ] ; id [ id ] = id ;
Token especial, seguimos compilando a partir de l
Recuperacin a nivel de frase: Intenta recuperar el error una vez
descubierto. En el caso anterior, por ejemplo, podra haber sido lo
suficientemente inteligente como para insertar el token ; . Hay que
tener cuidado con este mtodo, pues puede dar lugar a recuperaciones
infinitas.
Reglas de produccin adicionales para el control de errores: La
gramtica se puede aumentar con las reglas que reconocen los errores
ms comunes. En el caso anterior, se podra haber puesto algo como:
sent_errnea sent_sin_acabar sentencia_acabada ;
sentencia_acabada sentencia ;
sent_sin_acabar sentencia
Lo cual nos da mayor control en ciertas circunstancias
Correccin Global: Dada una secuencia completa de tokens a ser
reconocida, si hay algn error por el que no se puede reconocer,
consiste en encontrar la secuencia completa ms parecida que s se
pueda reconocer. Es decir, el analizador sintctico le pide toda la
secuencia de tokens al lxico, y lo que hace es devolver lo ms
parecido a la cadena de entrada pero sin errores, as como el rbol que
lo reconoce.

4.3 TIPO DE GRAMTICA QUE ACEPTA UN ANALIZADOR


SINTCTICO
Nosotros nos centraremos en el anlisis sintctico para lenguajes basados en
gramticas formales, ya que de otra forma se hace muy difcil la comprensin del
compilador, y se pueden corregir, quizs ms fcilmente, errores de muy difcil
localizacin, como es la ambigedad en el reconocimiento de ciertas sentencias.
La gramtica que acepta el analizador sintctico es una gramtica de contexto libre:
Gramtica : G (N, T, P, S)
N = No terminales.
T = Terminales.
P = Reglas de Produccin.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
S = Axioma Inicial.
Ejemplo: Se considera la gramtica que reconoce las operaciones aritmticas.
EE+T
|T
TT*F
|F
F ID
| NUM
|(E)
En el que: N = {E, T, F} estn a la izquierda de la regla.
T = {ID, NUM, ( ,) ,+ ,*}
P = Son las siete reglas de produccin.
S = Axioma inicial. Podra ser cualquiera, en este caso es E.
Derivaciones: La idea central es que se considera una produccin como
una regla de reescritura, donde el no terminal de la izquierda es
sustituido por la cadena del lado derecho de la produccin.
Derivacin por la izquierda: Derivacin donde solo l no terminal de ms a la
izquierda de cualquier forma de frase se sustituye en cada paso.
Derivacin por la derecha o Derivacin cannica: Derivacin donde el no
terminal ms a la derecha se sustituye en cada paso.
Ejemplo: Sea la gramtica
EE+E
|E-E
|E*E
|E/E
|E^E
| id
Constryase una derivacin por la izquierda y por la derecha para la siguiente frase:
a * c + b (id1 * id2 + id3)
Derivacin ms a la izquierda:
E < E + E < E * E + E< id1 * E + E < id1 * id2 + E < id1 * id2 + id3

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Derivacin ms a la derecha: E < E + E < E + id3 < E * E + id3 < E * id2 + id3 < id1 *
id2 + id3

4.4 RBOL SINTCTICO DE UNA SENTENCIA DE UN


LENGUAJE
Es una representacin que se utiliza para describir el proceso de derivacin de dicha
sentencia.
Como nodos internos del rbol, se sitan los elementos no terminales de las reglas
de produccin que vayamos aplicando, y tantos hijos como smbolos existan en la
parte derecha de dichas reglas.
Veamos un ejemplo: Sea la gramtica anterior.
EE+T|T
TT*F|F
F(E)|a|b
Supongamos que hay que reconocer: ( a + b ) * a + b
Si el rbol puede construirse, es que la sentencia es correcta:

Ilustracin 17

4.5 AMBIGEDAD:
Una gramtica es ambigua si derivando de forma diferente con el mismo tipo de
derivacin se llega al mismo resultado.
Ejemplo: Considrese la gramtica

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
E E+E
E E*E
E (E)
E id | num
si tenemos aux + cont + i
<ID><+><ID><+><ID>

Ilustracin 18

4.6 TIPOS DE ANLISIS


De la forma de construir el rbol sintctico se desprenden dos tipos o clases de
analizadores sintcticos. Pueden ser descendentes o ascendente
o Descendentes: Parten del axioma inicial, y van efectuando derivaciones
a izquierda hasta obtener la secuencia de derivaciones que reconoce a
la sentencia.
Pueden ser:
_ Con retroceso.
_ Con recursin.
_ LL(1)
Ascendentes: Parten de la sentencia de entrada, y van aplicando reglas
de produccin hacia atrs (desde el consecuente hasta el antecedente),
hasta llegar al axioma inicial.
Pueden ser:
_ Con retroceso.
_ LR(1)

4.7ANLISIS DESCENDENTE CON RETROCESO.

Objetivo : El mtodo parte del axioma inicial y aplica todas las posibles
reglas al no terminal ms a la izquierda.

Ejemplo: Utilizaremos la siguiente gramtica (No recursiva por la izquierda)

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
ET+E
ET
TF*T
TF
Fa
Fb
F (E)
Para reconocer la cadena de entrada: (a + b) * a + b

Ilustracin 19

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

4.8 ANLISIS ASCENDENTE CON RETROCESO.


Cuando se da cuenta que llega a una situacin en la que no puede continuar,
entonces vuelve atrs deshaciendo todos los cambios.
En el anlisis con retroceso no se permiten las reglas J, puesto que estas se podrn
aplicar de forma indefinida.
El algoritmo es el siguiente:

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

TEMA V FASE DE SNTESIS


5.1 FASE DE SNTESIS: Despus del proceso de anlisis se procede a
generar grupos de los componentes que conforman el programa, para generar una
salida.

Generacin de cdigo intermedio: este cdigo se genera con el fin de


mejorar el uso de la memoria con el fin de optimizar cdigo fuente.

Optimizacin de cdigo: el objeto de esta fase es mejorar el cdigo


para que sea ms rpido ejecutarlo.

Generacin de cdigo: Aqu se crea el cdigo final de salida que va a


ser interpretado por la mquina.

5.2 EN LA FASE DE ANLISIS SE ENCUENTRAN:


5.2.1 Anlisis Lxico: Esta fase se encarga de verificar si una cadena de
entrada del cdigo fuente pertenece o no al lenguaje, es decir se realiza un anlisis
smbolo a smbolo indicando el tken para cada una de las cadenas reconocidas o
un error en caso de no reconocer la cadena.

5.2.2 Anlisis Sintctico: En esta fase se analiza la estructura de las


expresiones en base a gramticas en base a reglas que determinar si una cadena de
entrada del cdigo fuente es vlida. El anlisis que se realiza es jerrquico ya que se
obtiene arboles de derivacin de las mismas gramticas especificadas en el
lenguaje.

5.2.3 Anlisis Semntico:

Este anlisis es mucho ms difcil de


formalizar que el sintctico ya que tiene que verificar que el rbol sintctico tenga un
significado valido dentro de las reglas especificadas en el lenguaje. El anlisis
semntico verifica que:

En una asignacin, el tipo de la variable concuerde con el tipo de la expresin


asignada.

Que las variables estn declaradas antes de ser usadas.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

Ilustracin 20

5.2.4 Generacin de cdigo intermedio:

Esta fase se ocupa de


generar instrucciones para la mquina virtual genrica a partir del anlisis de las
primeras tres fases.
Ej.:

a=b+c
1: + b c T1
2: = a T1

5.3 Optimizacin:

Se encarga de transformar el cdigo intermedio en uno


equivalente que tenga menos lneas de cdigo de menor tamao y menor tiempo de
ejecucin.
Ej,:
a=b+c
1: + b c a

5.4 Generacin de cdigo objeto:

Es la fase final en la que se


genera el cdigo objeto el cual utiliza el conjunto de instrucciones especifico del CPU
que por lo general es cdigo maquina o cdigo en lenguaje ensamblador.
Ej.:
a:=b+c
LOAD B
ADD C
STORE A

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

TEMA VI TABLA DE SMBOLOS Y MANEJO DE MEMORIA


6.1 TABLA: CONJUNTO DE PARES CLAVE-VALOR,
LLAMADOS ELEMENTOS DE LA TABLA.
La tabla de smbolos es una componente necesaria de un compilador. Al declarar un
identificador (normalmente una sola vez), ste es insertado en la tabla. Cada vez que
se utilice el identificador se realizar una bsqueda en la tabla para obtener la
informacin asociada (el valor).
Problemas asociados:

Bsqueda: dada la clave de un elemento, encontrar su valor.

Insercin: Dado un par clave-valor, aadir un elemento nuevo a la tabla.

Cambio de valor: Buscar el elemento y cambiar su valor.

Borrado: Eliminar un elemento de la tabla.

Longitud de bsqueda (o tiempo de acceso):

De una clave: Li = nmero de comparaciones con elementos de la tabla para


encontrar esa clave.

Mxima: LM = nmero mximo de comparaciones para encontrar cualquier


clave.

Media (esperada): Lm = nmero medio de comparaciones para encontrar un


valor.
o Si la frecuencia de todas las claves es la misma:
o

Lm = (S Li)/N

o Si la frecuencia de todas las claves no es la misma:


o

Lm = S pi.Li

Grado de ocupacin:
s = n/N donde n=nmero de elementos en la tabla y N=capacidad mxima de la
tabla.
Funcin de bsqueda: B : K->E asocia a cada clave k un elemento B(k).
Valor asociado a una clave k: v(B(k)). Puede ser mltiple, en cuyo caso normalmente
se convierte en un puntero. Si est en la tabla puede almacenarse consecutivamente
o en sus tablas paralelas.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

6.2 TABLAS DE SMBOLOS (IDENTIFICADORES)


La clave es el identificador. El valor est formado por:

Atributos del identificador.

Puntero a la posicin de memoria asignada.

La clave puede sustituirse por un puntero.


Los identificadores pueden estar empaquetados.
La longitud del identificador puede especificarse en la tabla o delante del nombre, o
ser implcita.

Tablas consecutivas: Todos los elementos ocupan posiciones de memoria


adyacentes.

Tablas ligadas: cada elemento apunta al siguiente.

Tablas doblemente ligadas: cada elemento apunta al siguiente y al anterior.

6.3 TABLAS NO ORDENADAS


Insercin: en el primer lugar vaco.
Bsqueda: secuencial, elemento a elemento.
Lm = (n+1)/2
LM = N
La bsqueda es muy lenta cuando el nmero de elementos es mayor que 20.

6.4 TABLAS ORDENADAS


Los elementos se ordenan con algn criterio (p.e. alfabticamente).
Bsqueda binaria o logartmica.
Algoritmo de bsqueda en el bloque (1,n):

Se mira el elemento (n+1)/2.

Si es ese, encontrado.

Si es menor, se busca en el bloque (1,(n-1)/2).

Si es mayor, se busca en el bloque ((n+3)/2,n).

Longitud de bsqueda:
Lm = 1+log2 (n) mucho mejor que en tablas no ordenadas.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
Insercin:

Se usa la bsqueda binaria para encontrar el elemento j tal que


K(E(j))<k<K(E(j+1))

Si la tabla es consecutiva, se corre toda la tabla un lugar desde E(j+1) hasta


E(n) y se introduce el elemento nuevo en E(j+1).

Si la tabla es ligada, se inserta un elemento nuevo entre E(j) y E(j+1).

En tablas consecutivas, si se van a insertar muchos elementos a la vez, podra


convenir ordenarlos al final para evitar tantos traslados.

6.5 TABLAS EN RBOL BINARIO


Usan rboles binarios. Se compara la clave k con la del elemento. Si es mayor, se va
a la derecha, si es menor a la izquierda. El tiempo de bsqueda depende del orden
de insercin de los elementos y slo es calculable si el rbol est equilibrado. Si no,
se convierte en una lista ordenada, reordenando. Ej: G D M E A B F H. Secuencias
aparentemente aleatorias pueden producir el mismo resultado.
Implementacin: con dos punteros: izquierda, derecha; o con una tabla secuencial
(2*i+1, 2*i+2).

6.6 TABLAS DE ACCESO DIRECTO


A cada clave se le asocia biunvocamente un elemento de la tabla mediante una
funcin I(k) biyectiva.
Ejemplo: identificadores de una sola letra. La tabla tendr 26/52 elementos como
mximo.
I(k) = k-'A'; // (26 elementos)
I(k) = (k<'a') ? k-'A' : 26+k-'a'; // (52 elementos)
Bsqueda: dado k, se halla I(k) y se tiene el elemento.
Li = Lm = LM = 1
Problema: si hay muchos identificadores, I no podr ser biyectiva. Llega un momento
en que obtener I(k) lleva ms tiempo que la bsqueda.

6.7 TABLAS HASH O DE ENTRADA CALCULADA


Es el mtodo ms usado. Se trata de trasformar la clave en un ndice de entrada
aplicndole una funcin Hash, I(k), que puede no ser biyectiva.
Es equivalente a una tabla de acceso directo mientras no aparezcan dos claves tales
que I(k1) = I(k2): colisin.
Hay dos mtodos principales para resolver la colisin.
Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

6.8 TABLAS HASH ABIERTAS (CON REHASH)


Supongamos que los elementos de T son 0,1,...,N-1.
Bsqueda de la clave k.

Se calcula h = I(k).

Se compara k con T(h). Si es igual, encontrado.

Si hay colisin (k!=T(h)&&T(h)!=NULL) se compara k con T(mod(h+p1,N)).

Si hay nueva colisin se compara k con T(mod(h+p2,N)).

...

Si hay nueva colisin se compara k con T(mod(h+pi,N)).

hasta que se encuentre la clave buscada, un lugar vaco o se vuelva a T(h).


En el primer caso, se ha encontrado. En el segundo, no est en la tabla. En el
tercero, tampoco est, y la tabla est llena para ese valor de la funcin Hash.

6.9 ASIGNACON DE MEMORIA


La forma en que el compilador organiza la memoria depende de las caractersticas
del lenguaje:

Soporte funciones recursivas


Posibilidad de referenciar nombres no locales
Modos de paso de parmetros
Admitir procedimientos como parmetros y/o valor devuelto
Posibilidad de asignar/desasignar memoria dinmicamente

6.10 ASIGNACIN ESTTICA


Modo de almacenamiento ms sencillo
Usado en primeros compiladores, ej.: FORTRAN
Disponer los datos en memoria durante compilacin

No es necesario aadir cdigo de gestin adicional


Tamao de variables debe poder conocerse en tiempo de compilacin
Direccin de las variables (globales y locales) es la misma durante toda
la ejecucin Fue calculada durante compilacin

Si admite procedimientos:

Se reserva en ms. Esttica espacio para un registro de activacin de


cada procedimiento
Guardara: parmetros, ver. Locales (y temporales), y valor devuelto

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores
No admite:

Procedimientos recursivos

imposible determinar en compilacin el no de registros de activacin necesarios

Estructuras dinmicas (listas, arboles, colas,...)

se desconoce el nm. de elementos en tiempo de compilacin


En compiladores modernos se usa asignacin esttica slo para cdigo,
vaRs. Globales y esttica, constantes, etc...

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

CONCLUSIN
Este trabajo servir mucho en el momento de la creacin de un compilador, ya que
en l se detallan todas y cada una de las partes que involucran a este. Primeramente
investigue que existen distintos tipos de compiladores, me gustara crear un
compilador de optimacin, ya que pienso que es muy til a la hora de crear un
algoritmo o programa. La funcin de un compiladores es leer un programa escrito es
un lenguaje, en este caso el lenguaje fuente, y lo traduce a un programa equivalente
en otro lenguaje, el lenguaje objeto. Me parece fascinante que nosotros podamos
crear un compilador en seis meses (en un curso), cuando en los aos 50, ya que en
aquellos tiempos se tardaron hasta 18 aos trabajando en un compilador. Por otro
lado, comprend que un compilador, requiere de una sintaxis y lenguajes especficos,
ya que, al igual que el lenguaje humano, si no lo escribimos correctamente el
compilador no har lo que deseamos. Y que en la compilacin hay dos partes:
Anlisis y Sntesis. La parte del anlisis divide al programa fuente en sus elementos
componentes y crea una representacin intermedia. Aprend que las herramientas
que muestran tipos de anlisis de programas fuente, son muy tiles al momento de
crear un programa al codificar un algoritmo, ya que estas herramientas nos ayudan
formateando el texto, corrigiendo errores, dando tips; para que nosotros como
programadores seamos ms eficientes al momento de crear alguna aplicacin.
Tambin he notado como todas nuestras materias se van complementando y
enlazando, por ejemplo, en matemticas discretas vimos la representacin de
rboles, los cuales usamos aqu. Igualmente en estructura de datos, vimos mtodos
de ordenamiento que las gramticas de los compiladores usan. Por lo tanto, no
parece tan complicado crear un compilador, slo se necesitan los conocimientos
adecuados y dedicarle su tiempo para tener xito.

Cunduacn Tab. Viernes 28 de noviembre de 2014

45

Compiladores

BIBLIOGRAFA
Compiladores, Principios, tcnicas y herramientas, Alfred V. Aho, Ravi
Sethi, Jeffrey D. Ullman. Addison Wesley iberoamericana.
Compiladores: Conceptos Fundamentales. B. Teufel, S. Schmidt, T.
Teufel. Addison Wesley Iberoamericana.
Stefano Crespi Reghizzi, Formal Lenguajes and Compilation, SpringerVerlag 2009.
Jhon E. Hopcroft, Introduccin a la Teora de Autmatas, Lenguajes y
Computacin
https://es.scribd.com/doc/4750526/12/fase-de-sintesis
http://www.frlp.utn.edu.ar/materias/sintaxis/gramaticas.pdf
http://www.dlsi.ua.es/docencia/asignaturas/comp1/comp1.html
http://www.cps.unizar.es/~ezpeleta/COMPI
http://www.ii.uam.es/~alfonsec

Cunduacn Tab. Viernes 28 de noviembre de 2014

También podría gustarte