Antologia de Compiladores

63
Universidad Juárez Autónoma de Tabasco Lic. En sistemas computacionales: Carlos Mario Palma Monjaraz (122h8065) Materia: Compiladores Maestro: Adán García Gómez División Académica De Informática y Sistemas

description

Se presenta una breve antología.

Transcript of Antologia de Compiladores

Compiladores

Universidad Jurez Autnoma de Tabasco

Lic. En sistemas computacionales:Carlos Mario Palma Monjaraz(122h8065)Materia:CompiladoresMaestro:Adn Garca Gmez

Divisin Acadmica De Informtica y Sistemas

Fecha de entrega:Viernes 28 de noviembre de 2014

ContenidoINTRODUCCIN4TEMA I GENERALIDADES51.1.1. (HISTORIA)51.1.2 INICIO DEL COMPILADOR51.1.3 BASES DE LAS TAREAS EN UN COMPILADOR51.1.4. OPTIMIZACIN EN LA COMPILACIN61.1.5 COMPILACIN EN LA ACTUALIDAD61.2. CONCEPTOS BSICOS71.3. CONCEPTO DE COMPILADOR81.4. INTERPRETAR VS COMPILAR81.4.1. VENTAJAS DE COMPILAR FRENTE A INTERPRETAR:91.4.2. VENTAJAS DEL INTRPRETE FRENTE AL COMPILADOR:91.5. TIPOS DE COMPILADORES101.6. ESTRUCTURA DE UN COMPILADOR.121.6.1. PREPROCESADOR121.6.2COMPILACIN131.6.3. ENSAMBLADO131.6.4. ENLAZADO141.7.1 FASE DE ANLISIS151.7.2. FASE DE SNTESIS161.8 EJEMPLO DEL PROCESO DE COMPILACIN171.9. HERRAMIENTAS PARA CONSTRUCCINDE COMPILADORES191.10. EL LENGUAJE Y LA HERRAMIENTA191.11.ASPECTOS ACADMICOS Y DE INVESTIGACIN DE COMPILADORES20TEMA II: ANLISIS LXICO212.1. ANLISIS LXICO (SCANNER)212.2. EL PROCESO DEL ANLISIS LXICO212.3.QUE ES UN ANALIZADOR LXICO?212.4. FUNCIONES DEL ANALIZADOR LXICO222.5. NECESIDAD DEL ANALIZADOR LXICO232.6. VENTAJAS DE SEPARAR EL ANLISIS LXICO Y EL ANLISISSINTCTICO232.7. COMPONENTES LXICOS, PATRONES, LEXEMAS232.7.1.COMPONENTE LXICO O TOKEN232.7.2. PATRN O EXPRESIN REGULAR242.7.3.LEXEMA242.8. DESCRIPCIN DE UN ANALIZADOR LXICO24TEMA III GRAMATICA263.1 GRAMTICAS263.2 AMBIGEDAD27TEMA IV ANALISIS SINTCTICO294.1 QU ES EL ANALIZADOR SINTCTICO?294.2 MANEJO DE ERRORES SINTCTICOS304.3 TIPO DE GRAMTICA QUE ACEPTA UN ANALIZADOR SINTCTICO314.4 RBOL SINTCTICO DE UNA SENTENCIA DE UN LENGUAJE334.5 AMBIGEDAD:334.6 TIPOS DE ANLISIS344.7ANLISIS DESCENDENTE CON RETROCESO.344.8 ANLISIS ASCENDENTE CON RETROCESO.36TEMA V FASE DE SNTESIS375.1 FASE DE SNTESIS375.2 EN LA FASE DE ANLISIS SE ENCUENTRAN:375.2.1 Anlisis Lxico:375.2.2 Anlisis Sintctico:375.2.3 Anlisis Semntico:375.2.4 Generacin de cdigo intermedio:385.3 Optimizacin:385.4 Generacin de cdigo objeto:38TEMA VI TABLA DE SMBOLOS Y MANEJO DE MEMORIA396.1 TABLA: CONJUNTO DE PARES CLAVE-VALOR, LLAMADOS ELEMENTOS DE LA TABLA.396.2 TABLAS DE SMBOLOS (IDENTIFICADORES)406.3 TABLAS NO ORDENADAS406.4 TABLAS ORDENADAS406.5 TABLAS EN RBOL BINARIO416.6 TABLAS DE ACCESO DIRECTO416.7 TABLAS HASH O DE ENTRADA CALCULADA416.8 TABLAS HASH ABIERTAS (CON REHASH)426.9 ASIGNACON DE MEMORIA426.10 ASIGNACIN ESTTICA42CONCLUSIN44BIBLIOGRAFA45

ndice de ilustraciones (Imgenes)Ilustracin 17Ilustracin 210Ilustracin 312Ilustracin 413Ilustracin 513Ilustracin 614Ilustracin 714Ilustracin 815Ilustracin 917Ilustracin 1018Ilustracin 1119Ilustracin 1220Ilustracin 1321Ilustracin 1422Ilustracin 1525Ilustracin 1625Ilustracin 1733Ilustracin 1834Ilustracin 1935Ilustracin 2038

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

TEMA I GENERALIDADES1.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 sencillaposible para el hombre. As, en 1950, desarrollaron el FORTRAN con el cual surgi as porprimera vez el concepto de un traductor (como un programa que traduca un lenguaje a otro lenguaje). En el caso particular de queel lenguaje a traducir es unlenguaje de alto nivel y el lenguaje traducido de bajo nivel, se emplea el trmino compilador.1.1.2 INICIO DEL COMPILADORLa 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 COMPILADOREn 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, 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 COMPILACINLa 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.1.1.5 COMPILACIN EN LA ACTUALIDADEn 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.Ilustracin 1

1.2. CONCEPTOS BSICOS Traductor.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 denominaCompilador 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 COMPILADOREn 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 COMPILARHay dos maneras de ejecutar un programa escrito en un lenguaje de alto nivel 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 partirde un programa fuente enun lenguaje de alto nivel. Algunos deseos programas son el preprocesador, el linker, el depurador y el ensamblador. El preprocesadorSe 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 depuradorPermite, 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.Ilustracin 2

1.5. TIPOS DE COMPILADORESEl programa compilador traduce las instrucciones en un lenguaje de alto nivel a instrucciones que la computadora puede interpretar y ejecutar. Para cada 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 oprograma 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. Optimacin: lee un cdigo fuente, lo analiza y descubre errores potenciales sin ejecutar el programa. Compiladoresincrementales: 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.

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

Ilustracin 4

1.6.2COMPILACINRecibe 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. ENSAMBLADOEste 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

Ilustracin 6

1.6.4. ENLAZADOEl 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 yubica 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:Ilustracin 8

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 Cdigo1.7.1 FASE DE ANLISISEn 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. 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 SNTESISGenera 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 COMPILACINSupongamos que un compilador tiene que analizar la siguiente preposicin:Suma= var1 + var2 + 10Anlisis LxicoEl 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: var1Operador: +Identificador: var2Operador: +Numero: 10Que en el anlisis lxico y con la tabla de smbolos es:id1= id2+ id3 * 10Anlisis SintcticoEl 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 SemnticoEl analizador semntico verificara en este caso que cada operador tenga los operados permitidos

Ilustracin 10

Anlisis SemnticoEl analizador semntico verificara en este caso que cada operador tenga los operados permitidos.=/\id1 +/\id2 +/\id3 tipo_ent|10Generador de cdigo intermedioEn esta etapa se lleva la preposicin a una representacin intermedia como unprograma para una maquinaabstracta.temp1= tipo_ent(10)temp2= id3 * temp1temp3= id2 + tem2id1= temp3Optimizacin de cdigoEl cdigo intermedio obtenido es representado de una forma ms optima y eficiente.temp1= id3 * 10.0id1= id2 + temp1Generador de cdigoFinalmente 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, R2MULT #10.0, R21.9. HERRAMIENTAS PARA CONSTRUCCINDE COMPILADORES Sistema de ayuda para escribir 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 aotra 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 freeware1.10. EL LENGUAJE Y LA HERRAMIENTAIlustracin 11

1.11.ASPECTOS ACADMICOS Y DE INVESTIGACIN DE COMPILADORESIlustracin 12

TEMA II: ANLISIS LXICO2.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 serla 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 enblanco, etc.2.2. EL PROCESO DEL ANLISIS LXICOEl 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.El analizador lxico tiene que dividir la secuencia de caracteres en palabras con significado propio y despus convertirlo a una secuencia de terminales desde elpunto de vista del analizador sintctico, que es la entrada del analizador sintcticoIlustracin 13

2.4. FUNCIONES DEL ANALIZADOR LXICOEl 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 elvalor numrico. Precisin: entero o real. constantes de caracteres: literales que representan cadenas concretas de caracteres, \hola mundo",...Ilustracin 14

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 LXICOUn 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 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, LEXEMAS2.7.1.COMPONENTE LXICO O TOKENEl 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.2.7.3.LEXEMAEs 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 LXICOEl 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 lneasIlustracin 15

Ilustracin 16

TEMA III GRAMATICA3.1 GRAMTICASLa 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 then La semntica de esta sentencia es que si el valor actual de la condicin es verdadero, se ejecutar .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).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:::= 0|1|2|3|4|5|6|7|8|9::= a|b|c|x|y|z::=|| En BNF, un no-terminal se escribe entre < >, el smbolo ::= significa se define como y el smbolo | significa o.Estas reglas definen como uno de los smbolos 0, 1 al 9; como una letra minscula e 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 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 no-terminales) 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 es:

3.2 AMBIGEDADUn 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::= if then | if then else ::= | begin endLa siguiente sentencia condicional tiene dos diferentes rboles de derivacin:if then if then else rbol 1

!if then |

|if then else Como hay dos interpretaciones, la gramtica es ambigua. Una solucin podra ser que lasentencia anterior se escriba:if thenbeginif then else endif thenbeginif then endelse

Dependiendo de la interpretacin que se desee.Otra solucin sera agregando un cierre del if (ya sea con un; o con un endif

TEMA IV ANALISIS SINTCTICOTodo 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.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 SINTCTICOSSi 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;

Errorid = 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 sentenciaLo 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 SINTCTICONosotros 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.S = Axioma Inicial.Ejemplo: Se considera la gramtica que reconoce las operaciones aritmticas. E E + T | T T T * 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 gramticaE E + E| E - E| E * E| E / E| E ^ E| idConstryase 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 Derivacin ms a la derecha: E < E + E < E + id3 < E * E + id3 < E * id2 + id3 < id1 * id2 + id34.4 RBOL SINTCTICO DE UNA SENTENCIA DE UN LENGUAJEEs 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.E E + T | TT T * F | FF ( E ) | a | bSupongamos que hay que reconocer: ( a + b ) * a + bSi 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 gramticaE E + EE E * EE ( E )E id | numsi tenemos aux + cont + i

Ilustracin 18

4.6 TIPOS DE ANLISISDe la forma de construir el rbol sintctico se desprenden dos tipos o clases de analizadores sintcticos. Pueden ser descendentes o ascendente 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) E T + E E T T F * T T F F a F b F (E)Para reconocer la cadena de entrada: (a + b) * a + b

Ilustracin 19

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:

TEMA V FASE DE SNTESIS5.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 delcdigofuente es vlida. El anlisisque se realiza esjerrquico ya que se obtiene arboles dederivacinde las mismasgramticas 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.

Ilustracin 205.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+c1: + b c T12: = a T15.3 Optimizacin: Se encarga de transformar el cdigo intermedio en uno equivalente que tenga menos lneas decdigode menor tamao y menor tiempo de ejecucin.Ej,:a=b+c 1: + b c a5.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+cLOAD BADD CSTORE A

TEMA VI TABLA DE SMBOLOS Y MANEJO DE MEMORIA6.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. Si la frecuencia de todas las claves es la misma: Lm = (S Li)/N Si la frecuencia de todas las claves no es la misma: Lm = S pi.LiGrado 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. 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 ORDENADASInsercin: en el primer lugar vaco. Bsqueda: secuencial, elemento a elemento. Lm = (n+1)/2 LM = NLa bsqueda es muy lenta cuando el nmero de elementos es mayor que 20. 6.4 TABLAS ORDENADASLos 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. Insercin: Se usa la bsqueda binaria para encontrar el elemento j tal que K(E(j))