Sie sind auf Seite 1von 19

RELIPMOC: Construcci on de un Compilador B asico haciendo uso de las herramientas JLex y CUP Semestre 2005-1

Mary Carmen Trejo Avila mary@ciencias.unam.mx LDNL, UNAM 2 de septiembre de 2004

Indice
1. Introducci on y Motivaci on. 1.1. Compilador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. An alisis l exico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Gram atica independiente del contexto. . . . . . . . . . . . . . . . . . . . . . . . . 1.4. Arbol de an alisis sint actico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5. An alisis sint actico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6. Denici on dirigida por la sintaxis. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7. Esquema de traducci on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.8. An alisis sem antico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9. C odigo de tres direcciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.10. Generaci on de c odigo intermedio. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.11. Optimizaci on de c odigo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.12. Generaci on de c odigo objeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.13. Tabla de s mbolos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.14. Gesti on de errores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Herramienta JLex: generador autom atico de analizadores l exicos. 2.1. C odigo de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Directivas JLex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Expresiones regulares. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 4 4 5 5 6 6 6 6 7 7 7 8 8 9 10

INDICE

3. Herramienta CUP: generador autom atico de analizadores sint acticos LALR. 11 3.1. Denici on de paquetes e importaci on de paquetes necesarios. . . . . . . . . . . . 3.2. C odigo de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. Declaraci on de s mbolos terminales y no terminales. . . . . . . . . . . . . . . . . 3.4. Declaraciones de precedencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5. Denici on del s mbolo inicial de la gram atica y las reglas de producci on. . . . . . 4. RELIPMOC: Un compilador propio. 4.1. Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Descripci on del lenguaje de entrada. . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1. Componentes l exicos de RELIPMOC. . . . . . . . . . . . . . . . . . . . . 4.2.2. Sintaxis de RELIPMOC. . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 12 12 14 14 15 15 16 16 16 18

4.3. Descripci on de salida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4. Implementaci on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. Proyecto.

Y MOTIVACION. INTRODUCCION

1.
1.1.

Introducci on y Motivaci on.


Compilador.

Es un programa que lee un programa escrito en un lenguaje fuente, y lo traduce a un lenguaje objeto de bajo nivel. Adem as generar a una lista de los posibles errores que tenga el programa fuente. [ASU86] [App98] La estructura de un compilador puede listarse de la siguiente manera: 1. 2. 3. 4. 5. 6. An alisis l exico. An alisis sint actico. An alisis sem antico. Generaci on de c odigo intermedio. Optimizaci on de c odigo intermedio. Generaci on de c odigo objeto. Con cada una de estas fases interactua la Tabla de s mbolos y la Gesti on de errores.

1.2.

An alisis l exico.

El analizador l exico (scanner), lee un texto fuente y lo transforma en una secuencia ordenada de elementos l exicamente v alidos. Un car acter o conjunto de estos que constituya un componente l exico se llama lexema (token). Como componentes l exicos consideramos: palabras reservadas, separadores, operadores, identicadores, constantes y signos de puntuaci on. Principales funciones de un analizador l exico: Manejar el archivo fuente (e.g. abrirlo, leerlo, cerrarlo). Generar y entregar tokens bajo la petici on del analizador sint actico. Rechazar un car acter o conjunto de estos que no concuerden con patrones especicados. Entendamos como patr on una expresi on regular que se dene en el lenguaje. Ignorar comentarios, espacios en blanco y tabuladores. Reconocer las palabras reservadas del lenguaje. Gestionar errores, contando los saltos de l nea y asociando los mensajes de error con el n umero de la l nea del archivo fuente donde se producen. Guardar tokens junto con su atributo en una tabla de s mbolos. Este atributo es informaci on adicional relevante, habitualmente con relaci on a los identicadores.

Y MOTIVACION. INTRODUCCION

1.3.

Gram atica independiente del contexto.


Una gram atica independiente del contexto tiene 4 componentes:

1. 2. 3. 4.

Un conjunto de s mbolos terminales. Un conjunto de s mbolos no terminales. La denominaci on de uno de los no terminales como s mbolo inicial. Un conjunto de producciones, en el que cada producci on consta de un no terminal, llamado lado izquierdo de la producci on, una echa y una secuencia de terminales y/o no terminales, llamado lado derecho de la producci on.

Denici on 1 Una gram atica independiente de contexto es un cuarteto: G = (T, N, S, P ) donde T es un conjunto nito de s mbolos terminales, N es un conjunto de s mbolos no terminales, S N es un s mbolo de comienzo y P es un conjunto nito de reglas de producci on. Cada regla de producci on en P es escrita convenientemente en la forma A ::= donde A N es un s mbolo no terminal y (T N ) es una cadena de s mbolos terminales y no terminales.

1.4.

Arbol de an alisis sint actico.

Indica gr acamente c omo del s mbolo incial de una gram atica deriva una cadena del lenguaje.

1.5.

An alisis sint actico.

Una forma de especicar la sintaxis de un lenguaje de programaci on (aspecto de sus programas) es mediante gram aticas independientes del contexto o BNF (Forma de Backus-Naur). El analizador sint actico (parser) recibe los tokens y determina si dicha cadena puede ser generada por una gram atica. Para ello debe encontrarse un a rbol de an alisis sint actico o, en su defecto, generar un error. A su vez este deber a recuperarse de los errores que ocurren frecuentemente para poder continuar procesando el resto de la entrada. La mayor a de los m etodos de an alisis sint actico est an comprendidos en dos clases: 1. M etodos descendente (LL). An alisis sint actico descendente recursivo. An alisis sint actico predictivo. An alisis sint actico predictivo no recursivo. 2. M etodos ascendente (LR).

Y MOTIVACION. INTRODUCCION

An alisis sint actico por desplazamiento y reducci on. An alisis sint actico por precedencia de operadores. An alisis sint actico LR. An alisis sint actico SLR. An alisis sint actico LR can onico. An alisis sint actico LALR. Estos t erminos, descendente y ascendente, hacen referencia al orden en que se construyen los nodos del a rbol de an alisis sint actico. En el primero, la construcci on se inicia en la ra z y avanza hacia las hojas, mientras que en el segundo, la construcci on se inicia en las hojas y avanza hacia la ra z. Las hojas de un a rbol de an alisis sint actico, le das de izquierda a derecha, forman la producci on del a rbol, que es la cadena generada o derivada del no terminal de la ra z del a rbol de an alisis sint actico. Los m etodos m as ecientes de an alisis, tanto descendente como ascendente, no funcionan para todas las gram aticas independientes del contexto, sino s olo para las gram aticas que cumplen unas determinadas condiciones. En la mayor a de los casos, pueden encontrarse para los lenguajes de programaci on gram aticas de tipo LL o LR que los generen. Los distintos analizadores sint acticos ser an vistos con detalle en el sal on de clase, as como la manera de atacar los errores en cada uno de ellos.

1.6.

Denici on dirigida por la sintaxis.

Es una generalizaci on de una gram atica independiente del contexto en la que cada s mbolo gramatical tiene un conjunto de atributos asociado, dividido en dos subconjuntos llamados atributos sintetizados y los heredados. T picos ejemplos de atributos son: una cadena o un n umero (valor de una expresi on), un tipo, una posici on de memoria o el c odigo objeto (destino) de una funci on. Si a es un atributo de un s mbolo gramatical X , escribiremos X.a para referirnos al valor del atributo a asociado al s mbolo gramatical X . Si en una producci on de la gram atica independiente del contexto aparece m as de una vez un s mbolo gramatical X , entonces se debe a nadir un sub ndice a cada una de las apariciones para podernos referir a los valores de los atributos de un modo no ambiguo: X1 .a, X2 .a, ..., Xn .a.

1.7.

Esquema de traducci on.

Es una gram atica independiente del contexto en la que se asocian atributos con los s mbolos gramaticales y se insertan acciones sem anticas encerradas entre llaves {}. Estos esquemas pueden tener tanto atributos sintetizados como heredados.

Y MOTIVACION. INTRODUCCION

1.8.

An alisis sem antico.

La sem antica de un lenguaje de programaci on (signicado de sus programas) es la parte de su especicaci on que no puede ser descrita por la sintaxis. El analizador sem antico se encarga de detectar la validez sem antica (e.g. declaraci on de identicadores, comprobaci on: de tipos, del ujo de control, de unicidad) del a rbol generado por el analizador sint actico. Para ello se asocia informaci on a una construcci on del lenguaje de programaci on proporcionando atributos a los s mbolos de la gram atica. Los valores de los atributos se calculan mediante reglas sem anticas asociadas a las producciones gramaticales. Hay dos notaciones para asociar reglas sem anticas con producciones, las deniciones dirigidas por la sintaxis y los esquemas de traducci on. Este tema ser a visto con mayor cuidado en el sal on de clase.

1.9.

C odigo de tres direcciones.


Es una secuencia de proposiciones de la forma general:

x := y op z donde x, y y z son nombres, constantes o variables temporales generados por el compilador; op representa cualquier operador, como un operador aritm etico de punto jo o otante, o un operador l ogico sobre datos con valores booleanos.

1.10.

Generaci on de c odigo intermedio.

El generador de c odigo intermedio transforma un a rbol sem antico en una representaci on en un lenguaje intermedio cercano al c odigo objeto. Este puede ser representado mediante: C odigo de tres direcciones (cu adruplos, triples y triples indirectos). Arboles abstractos Grafos dirigidos ac clicos C odigo de m aquina virtual

1.11.

Optimizaci on de c odigo.

El optimizador de c odigo realiza modicaciones sobre el c odigo intermedio para mejorar la eciencia en velocidad y tama no.

Y MOTIVACION. INTRODUCCION

1.12.

Generaci on de c odigo objeto.

El generador de c odigo objeto transforma el c odigo intermedio optimizado en c odigo objeto de bajo nivel. Este puede ser ensamblador o c odigo m aquina.

1.13.

Tabla de s mbolos.

Son estructuras de datos que almacenan toda la informaci on de los identicadores del archivo fuente. Las funciones principales de una tabla de s mbolos es colaborar con las comprobaciones sem anticas (uso de variables no declaradas, variables declaradas varias veces, incompatibilidad en los tipos de una expresi on, a mbitos, etc.), as como facilitar ayuda a la generaci on de c odigo. Las operaciones b asicas para estas estructuras son: insertar, consultar y borrar. Por la complejidad de estas operaciones es com un el uso de tablas hash para su implementaci on.

1.14.

Gesti on de errores.

El manejo de errores es una de las misiones m as importantes de un compilador, aunque, al mismo tiempo, es lo que m as diculta su realizaci on. Donde m as se utiliza es en las fases de an alisis sint actico y sem antico, aunque los errores se pueden descubrir en cualquier fase de un compilador. Es una tarea dif cil, 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 dos criterios a seguir a la hora de manejar errores: Detenerse al detectar el primer error. Detectar el mayor n umero posible de errores de una pasada.

HERRAMIENTA JLEX: GENERADOR AUTOMATICO DE ANALIZADORES LEXICOS. 8

2.

Herramienta JLex: generador autom atico de analizadores l exicos.

Para construir un compilador el primer paso que debemos dar es el de desarrollar el analizador l exico de nuestro lenguaje. Para esta tarea existen diversas herramientas tales como: Flex, Lex, Alex y JLex [Berex]. Existen diversas ventajas sobre el uso de estas herramientas, por ejemplo: la construcci on de aut omatas nitos determin sticos a partir de una especicaci on formal de los tokens es una tares autom atica, son f acilmente acoplables a otras herramientas de an alisis sint actico, entre otras. JLex es una herramienta desarrollada en Java, la cual genera un programa en Java a partir de una especicaci on en el que se indican los tokens permitidos por nuestro lenguaje. archivo.lex | JLex | archivo.lex.java | javac | Yylex.class Un archivo de especicaci on para JLex est a organizado en tres secciones, separadas por: % %, y tiene el siguiente formato: C odigo de usuario %% Directivas JLex %% Expresiones regulares % % debe estar al principio de la l nea. El resto de la l nea conteniendo % % debe descartarse y no debe usarse para declaraciones o c odigo.

2.1.

C odigo de usuario.

En esta secci on se crean las clases necesarias para nuestro analizador l exico, las cuales ser an copiadas directamente al inicio del archivo de salida. Se importan los paquetes necesarios, por ejemplo: import java cup.runtime.Symbol;.

HERRAMIENTA JLEX: GENERADOR AUTOMATICO DE ANALIZADORES LEXICOS. 9

2.2.

Directivas JLex.

En esta secci on se incluyen algunas reglas propias de JLex, por ejemplo: %cup para especicar el uso de CUP. Tambi en se pueden denir macros, que resuman ciertas expresiones regulares que nos ser an u tiles al momento de identicar tokens en la siguiente secci on, y estados. La sintaxis de una macro es: <nombre macro>= <expresi on regular v alida> Por ejemplo, podr a denirse una macro para reconocer n umeros enteros: NUMERO = [1-9][0-9] Los estados son declarados usando la directiva %state, y son usados para controlar cu ando reconocer ciertas expresiones regulares, por ejemplo para descartar comentarios y espacios en blanco. S olo un estado se declara de forma impl cita por JLex llamado YYINITIAL. Por default el analizador l exico obtenido iniciar a en YYINITIAL. Cada regla debe ser colocada en una nueva l nea. Las reglas comienzan con una lista opcional de estados. La regla se aplica s olo si el analizador l exico est a en el estado especicado. Si no se especica un estado se usa indondicionalmente. A continuaci on listo las directivas de mayor uso (a mi consideraci on): %{co digo %}, permite declarar c odigo interno al analizador l exico, el cual ser a copiado al inicio de la clase de salida. Generalmente se usa para declarar variables y m etodos. %type, permite cambiar el tipo de regreso del analizador l exico. Por default este tipo es Yytoken, declarado por JLex. Por ello es posible redenir la clase Yytoken en la primera secci on. %eof val{co digo %eof val}, permite cambiar el tipo de regreso para indicar el n de archivo. Este valor debe ser compatible con el tipo de regreso del m etodo yylex de la clase Yylex. El valor por default es NULL. %eof {co digo %eof }, permite a nadir c odigo Java el cual ser a ejecutado despu es de encontrarse un n de archivo. %init{co digo %init} Permite a nadir c odigo Java el cual ser a copiado en el constructor de la clase Yylex. %char, %line, permite activar el conteo de car acteres y de l neas. %eof throw{, %initthrow, %yylexthrow{ co digo %yylexthrow}, %initthrow}, %eof throw}, permite declarar las posibles excepciones arrojadas por los respectivos m etodos. %class < nombre >, %f unction < nombre >, permite cambiar el nombre de la clase del analizador l exico, por default Yylex, y el nombre de la funci on yylex respectivamente.

HERRAMIENTA JLEX: GENERADOR AUTOMATICO DE ANALIZADORES LEXICOS. 10

%public, permite que la clase del analizador l exico generada por JLex sea una clase p ublica. %cup, permite activar el uso de CUP.

2.3.

Expresiones regulares.

En esta secci on se denen las expresiones regulares que representan los tokens de nuestro lenguaje, y qu e debemos hacer una vez detectados dichos tokens. Las reglas tienen 3 partes: [<estado(s)>] <expresi on>{<acci on>} donde < estado(s) > es opcional y es un listado de los posibles estados a partir de los cuales la regla debe ser aceptada. Si no se indica un estado en espec co la regla se relaciona con todos. < expresio n > es una expresi on regular (regla). Si m as de una regla coincide con el patr on se elige la regla que genera la cadena m as larga. En caso de que la longitud sea la misma tiene prioridad la regla que est a especicada primero en el archivo. Si ninguna regla coincide se d a un error. < accio n > es la acci on asociada con la regla l exica, se puede declarar cualquier c odigo Java que se necesite. Tambi en se pueden generar transiciones entre los estados declarados. Esto es mediante una llamada a la funci on: yybegin(estado). Consid erense los siguientes puntos para la construcci on de expresiones regulares: El alfabeto para JLex es el conjunto de car acteres ASCII. Como metacar acteres tenemos: ?, , +, |, (, ), , $, ., [, ], {, }, , \\. Para concatenar usamos: |. Existe un conjunto de secuencias de escape (e.g. \n, \t y \r) que son reconocidas. El punto . coincide con cualquier car acter menos el de \n. Los metacar acteres pierden su signicado cuando est an entre comillas excepto \n. nombre macro denota la expansi on de una macro, donde < nombre macro > es el nombre con que fue declarada. El signo representa la cerradura de Kleene. El signo + signica una o m as repeticiones. El signo ? coincide con cero o una repetici on de la expresi on que lo precede. Los ( ) se usan para agrupar expresiones. Los [ ] denotan una clase de car acteres y coinciden con cualquiera de los car acteres encerrados. Si el primer car acter siguiendo a [ es , el conjunto est a negado y la expresi on coincide con cualquier car acter excepto los especicados. [\ \\] coincide con un gui on o una barra.

HERRAMIENTA CUP: GENERADOR AUTOMATICO DE ANALIZADORES SINTACTICOS LALR.11

3.

Herramienta CUP: generador autom atico de analizadores sint acticos LALR.

Para construir un compilador el segundo paso que debemos dar es el de desarrollar el analizador sint actico de nuestro lenguaje. Para esta tarea existen diversas herramientas tales como: Bison, Yacc, Happy, JavaCC, ANTLR y CUP [HudUP]. CUP es una herramienta desarrollada en Java para crear analizadores sint acticos LALR. Genera dos clases en Java, por default sym y parser, a partir de una especicaci on en la que se indica una gram atica formal as como tambi en se asocian una serie de acciones a los s mbolos aparecidos en cada regla gramatical. Por tanto esta herramienta cubre la fase de an alisis sint actico por el proceso de traducci on dirigida por la sintaxis. Tambi en dene un interfaz para acoplarse a los analizadores l exicos construidos con JLex. La clase sym est a constituida por los s mbolos terminales declarados en la gram atica, la cual es utilizada para hacer referencia a los mismos. La clase parser contiene al analizador sint actico. Un archivo de entrada para CUP consta de las siguientes 5 secciones: 1. 2. 3. 4. 5. Denici on de paquete e importaci on de paquetes necesarios. C odigo de usuario. Declaraci on de s mbolos terminales y no terminales. Declaraciones de precedencia. Denici on del s mbolo inicial de la gram atica y las reglas de producci on.

3.1.

Denici on de paquetes e importaci on de paquetes necesarios.

En este secci on se incluyen las construcciones para indicar que las clases Java generadas a partir de este archivo pertenecen a un determinado paquete y/o tambi en importar las clases Java necesarias. Por ejemplo: import java cup.runtime.*;.

3.2.

C odigo de usuario.

En esta secci on se puede incluir c odigo Java que el usuario desee incluir en el analizador sint actico que se va a obtener con CUP. Existen varias partes del analizador sint actico generado con CUP en donde se puede incluir c odigo de usuario. A su vez este esta dividido en 4 partes: actioncode{: co digo :}, permite incluir c odigo Java el cual es utilizado por las acciones especicadas en la gram atica. parsercode{: co digo :}, permite incluir c odigo Java en la clase parser. Aqu se pueden redenir los m etodos que se invocan como consecuencia de errores de sintaxis.

HERRAMIENTA CUP: GENERADOR AUTOMATICO DE ANALIZADORES SINTACTICOS LALR.12

initwith{: co digo :}, permite incluir c odigo Java el cual ser a ejecutado por al traductor antes de que este pregunte por el primer token. scanwith{: co digo :}, permite indicar c omo el traductor preguntar a por el siguiente token al analizador l exico.

3.3.

Declaraci on de s mbolos terminales y no terminales.

En esta secci on se declaran los s mbolos terminales y no terminales de la gram atica que dene el analizador sint actico que deseamos producir. Tanto los s mbolos no terminales como los s mbolos terminales pueden, opcionalmente, tener asociado un objeto Java de una cierta clase. Por ejemplo, en el caso de un s mbolo no terminal, esta clase Java puede representar los sub arboles de sintaxis abstracta asociados a ese s mbolo no terminal. En el caso de los s mbolos terminales, el objeto Java representa el dato asociado al token. Por ejemplo, un objeto de la clase Integer que represente el valor de una constante, o un String que represente el nombre de un identicador. La sintaxis es: terminal [<nombre clase>] nombre01, nombre02, ..., nombreN y non terminal [<nombre clase>] nombre01, nombre02, ..., nombreN

3.4.

Declaraciones de precedencia.

En esta secci on es posible denir niveles de precedencia y la asociatividad de s mbolos terminales. Las declaraciones de precedencia de un archivo CUP consisten en una secuencia de construcciones que comienzan con la palabra clave precedence. A continuaci on, viene la declaraci on de asociatividad, que puede tomar los valores lef t (el terminal se asocia por la izquierda), y right (el terminal se asocia por la derecha). Finalmente, la construcci on termina con una lista de s mbolos terminales separados por comas, seguido del s mbolo ;. La precedencia de los s mbolos terminales viene denida por el orden en que aparecen las construcciones precedence. Los terminales que aparecen en la primera construcci on precedence son los de menor precedencia, a continuaci on vienen los de la segunda construcci on precedence y as sucesivamente, hasta llegar a la u ltima, que dene a los termianles con mayor precedencia.

3.5.

Denici on del s mbolo inicial de la gram atica y las reglas de producci on.
Para denir el s mbolo inicial de la gram atica se utiliza: startwith < no terminal >. Las reglas de producci on tienen esta sintaxis:

on {: co digo :}; expresi on ::= expresi on <s mbolo terminal>expresi donde expresi on son no terminales, y a la derecha est a el c odigo Java que se ejecutar a al aplicarse esta producci on.

HERRAMIENTA CUP: GENERADOR AUTOMATICO DE ANALIZADORES SINTACTICOS LALR.13

Se pueden denir todas las reglas de producci on que tengan a un mismo s mbolo no terminal como antecedente separ andolas por el s mbolo |.

RELIPMOC: UN COMPILADOR PROPIO.

14

4.
4.1.

RELIPMOC: Un compilador propio.


Introducci on

Hasta esta secci on tenemos un panorama b asico de los conceptos necesarios para poder construir un compilador; por lo que ahora mi tarea es realizar uno. Este compilador recibir a como entrada un archivo donde se encontrar a un programa escrito en m propio lenguaje, y mostrar a como salida el proceso en las fases de an alisis l exico, sint actico y sem antico, as como la tabla de s mbolos, c odigo intermedio y el resultado de las operaciones especicadas. Para ello utilizar e las herramientas abarcadas en las dos secciones anteriores. Este compilador ser a sencillo (con la u nica nalidad de mostrar el uso de las herramientas de forma conjunta) y de una sola pasada. Para poder hacer uso de las herramientas es necesario instalar el SDK para J2SE (Java 2 Standard Edition), el cual puede descargarse de la p agina: http://java.sun.com. Para ejecutar JLex es necesario crear un directorio que se llame JLex y ah copiar el archivo fuente de JLex (Main.java) el cual puede descargarse de la p agina: http://www.cs.princeton.edu/ appel/modern/java/JLex/. Finalmente, este archivo debe ser compilado para obtener las clases Java que componen la distribuci on de JLex. La sintaxis para usar JLex es: java JLex.Main [archivo.lex] donde archivo.jlex es el nombre del archivo con una especicaci on JLex. Para ejecutar CUP es necesario descargar el c odigo fuente el cual puede obtenerse de la p agina: http://www.cs.princeton.edu/ appel/modern/java/CUP/. Finalmente, debes descomprimirlo. En caso de ser necesario compila todos los archivos fuente que se encuentren en los directorios java cup/ y java cup/runtime/. La sintaxis para usar CUP es: java java cup.Main [opciones] <[archivo.cup] donde archivo.cup es el nombre del archivo con una especicaci on CUP. Al ser herramientas desarrolladas en Java, pueden modicar cualquier archivo con extensi on .java con total responsabilidad (e.g. permitir que la clase llamada Yylex por default se nombre distinto, etc.), y tener distintos benecios.

RELIPMOC: UN COMPILADOR PROPIO.

15

4.2.

Descripci on del lenguaje de entrada.

Este lenguaje tiene una sintaxis similar a la del lenguaje Java. Fue denido, por m , para ilustrar el uso de JLex y CUP conjuntamente, bas andome en el ejemplo original (el cual puedes obtener de las p aginas ociales de las herramientas), que consiste en una calculadora. Al igual que en la mayor a de los lenguajes de programaci on modernos, los espacios en blanco, tabulaciones, y saltos de l nea no afectan el signicado del programa. Sin embargo, se suelen respetar convenciones en la escritura para facilitar la lectura del c odigo. 4.2.1. Componentes l exicos de RELIPMOC. InputElement WhiteSpace Comment Token Identier Letter Digit Keyword Literal Integer Separator Operator WhiteSpace | Comment | Token space | \t | \r | \n | \f /** any string */ Identier | Keyword | Literal | Separator | Operator Letter | Identier Letter | Identier Digit a | b | ... | z | A | B | ... | Z 0 | 1 | ... | 9 class | int | void Integer Digit | Integer Digit ( | ) | { | } | ; = | + | - | *

Los tokens que pueden aparecer se pueden dividir en cinco clases: Identier, Keyword, Literal, Separator y Operator. El resto WhiteSpace y Comment es ignorado durante el an alisis l exico.

RELIPMOC: UN COMPILADOR PROPIO.

16

4.2.2.

Sintaxis de RELIPMOC. program class declaration class body method declaration method body variable declarations variable declaration type numeric type variable declarator block statements statements statement expression | | | | | | | class declaration class Identier class body { method declaration } void Identier ( ) method body { variable declarations block statements } variable declaration variable declarations variable declaration type variable declarator ; numeric type int Identier = Literal statements block statements statements statement ; expression Literal Identier expression expression expression + expression expression expression ( expression )

4.3.

Descripci on de salida.

La salida mostrada ser a el proceso en las fases de an alisis l exico, sint actico y sem antico, as como la tabla de s mbolos, c odigo intermedio (c odigo de tres direcciones sin optimizaci on -estilo Mary Carmen-) y el resultado de las operaciones especicadas (recordemos que est a basado en una calculadora). En este caso, el c odigo de tres direcciones consiste en crear asignaciones y resultados de operaciones binarias tales como suma, resta y multiplicaci on, en variables temporales. As como su reutilizaci on para operaciones anidadas.

4.4.

Implementaci on.

Esta secci on se encuentra descrita en dos archivos de especicaci on, specication.lex y specicatio.cup. B asicamente, en estos archivos se reejan los componentes l exicos y la gram atica que compone al lenguaje, as como c odigo Java para crear c odigo de tres direcciones, manejo de errores, etc. Adem as es desarrollaron 3 clases: ElementSymbolTable, SymbolTable y Main. La primera describe los atributos, que en lo personal, interesantes para la toma de decisiones en la fase de an alisis sint actico y sem antico. En la segunda clase se describe la estructura en la cual ser an almacenados temporalmente los tokens adecuados junto con sus atributos. Finalmente, en la

RELIPMOC: UN COMPILADOR PROPIO.

17

u ltima clase (clase principal) se realizan las llamadas a los objetos, constructores, m etodos y atributos adecuados, para la visualizaci on de un completo proceso llevado a cabo por el compilador. Para ver este compilador ejecutarse, es necesario obtener el archivo relipmoc.tgz, el cual puede descargarse del URL: http://www.dynamics.unam.edu/ mtrejo/cursos/compiladores/relipmoc.tgz, descomprimirlo, y ejecutar make, make execute (para un u nico ejemplo) y nalmente make clean. Este archivo contiene un directorio llamado Ejemplos, donde se encuentran 3 u nicos ejemplos.

PROYECTO.

18

5.

Proyecto.

Como uno de los objetivos principales de este curso, as como la intenci on de realizar este documento, es que los alumnos dise nen e implementen un compilador. Este peque no proyecto estar a dividido en tres entregas: 1. 2. 3. An alisis l exico, manejo de errores (nivel an alisis l exico), componentes l exicos de su lenguaje y bosquejo de la gram atica de su lenguaje. An alisis sint actico, manejo de errores (nivel an alisis sint actico), tabla de s mbolos y gram atica de su lenguaje. An alisis sem antico, manejo de errores (nivel an alisis sem antico), obtenci on de c odigo intermedio. Para cada una de estas entregas se debe incluir: El archivo(s) de especicaci on que se le ingresa a las herramientas generadores de analizadores. Un programa que reciba como entrada un archivo con un programa en su propio lenguaje y verique si es l exica, sint acticamente, sem anticamente correcto, as como la obtenci on de resultados necesarios en cada entrega. Ejemplos de programas, escritos en su propio lenguaje, correctos e incorrectos. Ustedes elegir an el lenguaje fuente y el lenguaje objeto sobre el cual trabajar an, siempre y cuando estos tengan una estrecha relaci on para poder levar a cabo la tarea del compilador. Por lo que no, necesariamente, har an uso de las herramientas expuestas en este documento, sin embargo deber an hacer entrega de los puntos antes estipulados. El uso de herramientas, estrictamente para apoyo, es totalmente libre. Tambi en elegir an la gram atica para su lenguaje, teniendo como m nima la presentada en el libro Compilers de Aho, Sethi y Ullman. El compilador aqu descrito puede ser usado con total libertad como base del de ustedes, a excepci on del c odigo de tres direcciones. Esta fase deber a ser ampliamente extendida por ustedes.

Referencias
[App98] Andrew W. Appel. Modern compiler implementation in Java. Cambridge University Press, 1998. [ASU86] Alfred V. Aho, Ravi Sethi, and Jerey D. Ullman. Compilers; principles, techniques and tools. Addison-Wesley Publishing Company, 1986. [Berex] Elliot Berk. JLex: A lexical analyzer generator for Java. JLex user manual. 1997. http://www.cs.princeton.edu/appel/modern/java/JLex/.

REFERENCIAS

19

[HudUP] Scott E. Hudson. CUP users manual. 1999. http://www.cs.princeton.edu/appel/modern/java/CUP/.

Das könnte Ihnen auch gefallen