Anda di halaman 1dari 6

Ivan Nadir Morales Hernndez nivanos@hotmail.

com

Un compilador
Introduccin
Una computadora no puede entender el lenguaje escrito o hablado que los humanos usamos a diario en nuestras conversaciones, y por el otro lado nosotros no entendemos el lenguaje binario que la computadora usa para realizar sus tareas. De esta forma es necesario para nosotros escribir las instrucciones en algn lenguaje especial bien definido1, al que nosotros podamos entender, y luego convertir ese lenguaje a instrucciones del lenguaje que la maquina pueda entender. Este es el trabajo de un compilador. Un compilador C++ es un programa de computadora, del cual su nico trabajo es convertir el programa C++ de nuestra forma a otra forma que la computadora pueda leer y ejecutar. La computadora prefiere una cadena de 0s y 1s que no significan nada para nosotros, pero que puede ser rpidamente y precisamente entendida por la computadora. Al programa original en C++ los llamamos cdigo fuente y al cdigo compilado resultante producido por el compilador lo conocemos como cdigo objeto. Uno o ms cdigos objeto se combinan con libreras2 predefinidas por un ligador o linker, algunas veces llamado binder para producir el archivo final completo que pueda ser ejecutado por una computadora. Cualquier buen compilador que pudiramos desarrollar no solamente debe de proveer al compilador, debe de incluir un buen editor, un depurador o debugger, una librera y un ligador o linker.

1 2

Este caso nosotros usaremos el lenguaje de programacin C, o alguna de sus derivaciones, como lo es Flex y Lex. Una librera es una coleccin de varios cdigos objetos precompilados que proveen operaciones que son usados por los programas para la computadora

Ivan Nadir Morales Hernndez nivanos@hotmail.com

Anlisis de un compilador
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. De las dos partes, la sntesis es la que requiere la tcnica ms especializada. Durante el anlisis se determina las operaciones que implica el programa fuente y se registra en una estructura jerrquica llamada rbol. A menudo, se usa una clase especial de rbol llamado rbol sintctico, donde cada nodo representa una operacin y los hijos de un nodo son los argumentos de la operacin. Por ejemplo, en la figura 1 se muestra un rbol sintctico para una proposicin de asignacin.

Tabla De Smbolos
Un compilador necesita guardar y usar la informacin de los objetos que se va encontrando en el texto fuente, como variables, etiquetas, declaraciones de tipos, etc. Esta informacin se almacena en una estructura de datos interna conocida como tabla de smbolos. El compilador debe desarrollar una serie de funciones relativas a la manipulacin de esta tabla como insertar un nuevo elemento en ella, consultar la informacin relacionada con un smbolo, borrar un elemento, etc. Como se tiene que acceder mucho a la tabla de smbolos los accesos deben ser lo ms rpidos posible para que la compilacin sea eficiente.

Manejo de errores.
Es una de las misiones ms importantes de un compilador, aunque, al mismo tiempo, es lo que ms dificulta su realizacin. Donde ms se utiliza es en las etapas de anlisis sintctico y semntico, aunque los errores se pueden descubrir en cualquier fase de un compilador. Es una tarea difcil, por dos motivos: A veces unos errores ocultan otros. A veces un error provoca una avalancha de muchos errores que se solucionan con el primero.

Es conveniente un buen manejo de errores, y que el compilador detecte todos los errores que tiene el programa y no se pare en el primero que encuentre. Hay, pues, dos criterios a seguir a la hora de manejar errores: o o Pararse al detectar el primer error. Detectar todos los errores de una pasada.

En el caso de un compilador interactivo (dentro de un entorno de desarrollo integrado, como Turbo-Pascal o Borland C++) no importa que se pare en el primer error detectado, debido a la rapidez y facilidad para la correccin de errores.

Ivan Nadir Morales Hernndez nivanos@hotmail.com

Herramientas de los tipos de anlisis del programa fuente


Muchas herramientas de software que manipulan programas fuente, realizan primero algn tipo de anlisis. Algunos ejemplos de tales herramientas son:

1.

2.

3.

4.

Editores de estructuras: un editor de estructuras toma como entrada una secuencia de rdenes para construir un programa fuente. El editor de estructuras no slo realiza las funciones de creacin y modificacin de textos de un editor de textos ordinario, sino que tambin analiza el texto del programa imponiendo al programa fuente una estructura jerrquica apropiada. De esa manera, el editor de estructuras puede realizar tareas adicionales tiles para la preparacin de programas. Por ejemplo, puede comprobar si la entrada est formada correctamente, puede proporcionar palabras clave de manera automtica y puede saltar desde un begin o un parntesis izquierdo hasta su correspondiente end o parntesis derecho. Adems, la salida de tal editor suele ser similar a la salida de la fase del anlisis de un compilador. Impresoras estticas: Una impresora esttica analiza un programa y lo imprime de forma que la estructura del programa resulte claramente visible. Por ejemplo, los comentarios pueden aparecer con un tipo de letra especial, y las proposiciones pueden aparecer con una indentacin proporcional a la profundidad de su anidamiento en la organizacin jerrquica de las proposiciones. Verificadores estticos: Un verificador esttico lee un programa, lo analiza e intenta descubrir errores potenciales sin ejecutar el programa. La parte del anlisis es similar a la que se encuentra en los compiladores de optimacin. As un verificador esttico puede detectar si hay partes de un programa que nunca se podrn ejecutar o si cierta variable se usa antes de ser definida. Adems, puede detectar errores de lgica como intentar utilizar una variable real como apuntador, empleando las tcnicas de verificacin de tipos. Intrpretes: En lugar de producir un programa objeto como resultado de una traduccin, un intrprete realiza las operaciones que implica el programa fuente. Para una proposicin de asignacin, por ejemplo, un intrprete podra construir un rbol, y despus efectuar las operaciones de los nodos conforme "recorre" el rbol de la figura 1. En la raz descubrira que tiene que realizar una asignacin, y llamara a una rutina para evaluar la expresin de la derecha y despus almacenara el valor resultante en la localidad de memoria asignada con el identificador posicin. En el hijo derecho de la raz, la rutina descubrira que tiene que calcular la suma de dos expresiones. Se llamara a si misma de manera recursiva para calcular el valor de la variable inicial.

Figura 1

Ivan Nadir Morales Hernndez nivanos@hotmail.com

Fases de un compilador.
Al principio de la historia de los compiladores, el tamao del programa ejecutable era un recurso crtico, as como la memoria que utilizaba el compilador para sus datos, por lo que lo frecuente era que cada fase leyera un archivo escrito por la fase anterior y produjera un nuevo archivo con el resultado de las transformaciones realizadas en dicha fase. Esta tcnica haca que el compilador realizara muchas pasadas sobre el programa fuente. En los ltimos aos el tamao del archivo ejecutable de un compilador es relativamente pequeo comparado con el de otros programas del sistema. Por estos motivos, y dado que escribir y leer un archivo de tamao similar o mayor que el del programa fuente en cada fase es una prdida considerable de tiempo, la tendencia actual es la de reducir el nmero de archivos que se leen o escriben y por tanto reducir el nmero de pasadas, incluso el de aqullas que se realizan en memoria, sin escribir ni leer nada del disco.

Las fases se agrupan en dos partes o etapas: front end (las fases de anlisis) y back end (las fases de generacin y optimizacin de cdigo). Estas dos etapas se comunican mediante una representacin intermedia (generada por el front end), que puede ser una representacin de la sintaxis del programa (un rbol sintctico abstracto) o bien puede ser un programa en un lenguaje intermedio. El front end depende del lenguaje fuente y casi siempre es independiente (o debe serlo) de la mquina objeto para la que se va a generar cdigo; el back end depende del lenguaje objeto y debe ser independiente del lenguaje fuente (excepto quiz para algn tipo de optimizacin).

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

Hay dos 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. Se considera que un token tiene dos partes componentes: el tipo de token y su valor. 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 innecesarios para la siguiente fase, como los tabuladores, comentarios, espacios en blanco, etc.

Ivan Nadir Morales Hernndez nivanos@hotmail.com

Anlisis Sintctico
El analizador sintctico, tambin llamado parser, recibe como entrada los tokens que le pasa el Analizador Lxico (el analizador sintctico no maneja directamente caracteres) y comprueba si esos tokens van llegando en el orden correcto (orden permitido por el lenguaje). La salida de la fase de anlisis sintctico sera un rbol sintctico.

As pues, sus funciones son: Aceptar lo que es vlido sintcticamente y rechazar lo que no lo es. Hacer explcito el orden jerrquico que tienen los operadores en el lenguaje de que se trate. Por ejemplo, la cadena A/B*C es interpretada como (A/B)*C en FORTRAN y como A/ (B*C) en APL. Guiar el proceso de traduccin (traduccin dirigida por la sintaxis).

Anlisis Semntico
El anlisis semntico es posterior al sintctico y mucho ms difcil de formalizar que ste. Se trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre s, etc. En definitiva, comprobar que el significado de lo que se va leyendo es vlido. La salida "terica" de la fase de anlisis semntico sera un rbol semntico. Consiste en un rbol sintctico en el que cada una de sus ramas ha adquirido el significado que debe tener. En el caso de los operadores polimrficos (un nico smbolo con varios significados), el anlisis semntico determina cul es el aplicable. Por ejemplo, consideremos la siguiente sentencia de asignacin: A := B + C

En Pascal, el signo "+" sirve para sumar enteros y reales, concatenar cadenas de caracteres y unir conjuntos. El anlisis semntico debe comprobar que B y C sean de un tipo comn o compatible y que se les pueda aplicar dicho operador. Si B y C son enteros o reales los sumar, si son cadenas las concatenar y si son conjuntos calcular su unin.

Ejemplo:

VAR ch : CHAR; (* Un identificador ent: INTEGER; (* previamente ... ch := ent + 1; (* En Pascal no es vlido, en C s. *)

no no

se se

puede ha

utilizar si definido.

*) *)

Ivan Nadir Morales Hernndez nivanos@hotmail.com


Anlisis Lxico: Devuelve la secuencia de tokens: id asig id suma numero ptocoma Anlisis Sintctico: Orden de los tokens vlido Anlisis Semntico: Tipo de variables asignadas incorrecta

Analizador de expresiones regulares


En esta ocasin, solo desarrollaremos un programa que dado una expresin regular, de cmo salida todas las combinaciones posibles del los caracteres validos, es decir que de cmo salida las palabras validas. Por la complejidad de las expresiones tome varias herramientas en el programa 3 como la necesidad de tomar una concatenacin a dos letras separadas de un punto, a la unin definida con el smbolo | y predefinir el tamaa de las cerraduras (kleene y positiva) al pedir un numero despus de los smbolos * y + respectivamente el cual me indica el nivel mximo de combinaciones.

Bibliografa
Compiladores, Principios, tcnicas y herramientas, Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. Addison Wesley iberoamericana. http://www.dlsi.ua.es/docencia/asignaturas/comp1/comp1.html http://www.cps.unizar.es/~ezpeleta/COMPI http://www.ii.uam.es/~alfonsec

El cdigo el programa no se anexa impreso pues serian muchas hojas extras, pero se encuentra en el archivo grabado en el disco entregado como anexo.

Anda mungkin juga menyukai