Está en la página 1de 9

GENERACIN COMPLETA DE COMPILADORES MEDIANTE DIAGRAMAS DE SINTAXIS EXTENDIDOS

Sergio Glvez Rojas David Tinaquero Fernndez Antonio Guevara Plaza Antonio Luis Carrillo Len

Dpto. de Lenguajes y Ciencias de la Computacin Universidad de Mlaga galvez@lcc.uma.es Resumen La construccin de esqueletos bsicos de compiladores es una labor que ha sido ampliamente superada tras los estudios tericos de Chomsky sobre gramticas, y el desarrollo posterior de multitud de herramientas, llamadas metacompiladores (Yacc, Bison, byacc, PRE-CC Xtended, etc.), cuyo objetivo es el de generar programas que reconozcan si una frase sigue o no determinada gramtica. Todas estas herramientas se basan en elementos puramente textuales, ridos y de difcil asimilacin, que no suelen ser los ms acertados a la hora de inculcar los conocimientos bsicos en un curso de Traductores, compiladores e intrpretes propio de la titulacin de Informtica. Para solventar esta carencia, hemos desarrollado MEDISE, una herramienta que parte de una gramtica expresada de forma grfica (mediante diagramas de sintaxis) junto con la especificacin de las acciones a ejecutar, y genera un programa en C cuyo flujo de ejecucin ser una fiel representacin del camino seguido en tales grficos para reconocer (o rechazar) la secuencia de palabras encontrada a la entrada. A medida que las palabras de la entrada van encajando segn la gramtica propuesta, se van ejecutando las acciones que el usuario haya dispuesto.

Introduccin.

En los actuales estudios conducentes a la titulacin media o superior de Ingeniero en Informtica, existe una materia troncal que tiene por objetivo que el alumno adquiera los conocimientos suficientes como para desarrollar pequeos traductores o intrpretes que le faciliten su posterior desarrollo profesional: desde un pequeo conversor que traduzca las palabras de un lenguaje de programacin en ingls a uno en castellano, hasta calculadoras con funciones preprogramadas, pasando por pequeas hojas de clculo, o conversores de macros en . Suele utilizarse para estos propsitos el tndem Lex-Yacc [BEN90] o sus correspondientes PcLex-PcYacc, Flex-Bison, Flex++-Bison++, o cualquier otro par de herramientas que se encargan de generar analizadores lxicos y sintcticos en un lenguaje de programacin determinado. El punto de partida suele ser la definicin de una gramtica que, para nuestros propsitos, podemos ver como un conjunto de reglas que sirven para validar una frase. El objetivo es crear automticamente programas que, partiendo de una gramtica, sean capaces de decidir si una frase est correctamente construda o no en base a dicha gramtica. Aunque estas gramticas pueden expresarse de muy diversas formas ([JAV98], [PAR90]), suele pasarse por alto la enorme utilidad que suponen los diagramas de sintaxis en el desarrollo

de este tipo de analizadores. El presente trabajo supone la continuacin de la herramienta MDC presentada en la IE99, [GAL99]. MDC permita generar automticamente programas que aceptaban o rechazaban frases en base a diagramas de sintaxis que el alumno poda dibujar de forma interactiva. Sin embargo, con MDC era imposible efectuar traducciones; en otras palabras, MDC se limitaba a generar programas que decan S o No, lo cual se corresponde con la fase de anlisis sintctico de cualquier traductor. MEDISE (MEtacompilacin con DIagramas de Sintaxis Extendidos) extiende las posibilidades de MDC y permite incorporar cdigo en lenguaje C dentro de un diagrama de sintaxis, con lo que es posible crear un traductor completo de cualquier lenguaje de programacin que admita un anlisis de gramticas LL(1). El presente trabajo se estructura como sigue: en el punto 2 recordamos los conceptos bsicos de un diagrama de sintaxis y cmo se pueden extender para producir compiladores completos; el punto 3 expone el proceso seguido por el diseador para generar un compilador completo y las caractersticas de ste; el procesamiento interno referido a las extensiones propuestas a los diagramas de sintaxis convencionales se explica en el punto 4 mientras que en el punto 5 abordamos el trabajo futuro.

Diagramas de sintaxis.

Los diagramas de sintaxis aparecidos inicialmente en [CON63], constituyen un mecanismo grfico mediante el que aproximar, por refinamientos sucesivos, el lenguaje admisible por Figura 1. secuenciaDeSentencias. una gramtica. A grandes rasgos, un diagrama de sintaxis es un grafo dirigido en el que los nodos representan los smbolos terminales y no terminales de la gramtica, y los arcos expresan las secuencias en que pueden combinarse tales smbolos para formar frases aceptables segn la gramtica. Cada diagrama de sintaxis representa un smbolo no terminal (que se puede expandir), de manera que la gramtica completa estar formada por tantos diagramas distintos e interrelacionados como no terminales se quieran incluir en su descripcin. Los smbolos terminales (palabras o tokens) se dibujan como crculos o elipses etiquetadas con el nombre del token, mientras que los no terminales que aparecen en un grafo se dibujan como rectngulos etiquetados con su nombre correspondiente. Todo diagrama posee un punto de entrada (generalmente situado a la izquierda) y un punto de salida (a la derecha), y que estn representados por un arco sin origen y un arco sin destino respectivamente. Las figuras 1, 2 y 3 ilustran diversos diagramas
Figura 2. sentencia.

de Conway correspondientes al lenguaje de programacin Modula-2 [WIR88]. La figura 1 Especifica que una secuenciaDeSentencias est formada por una sentencia, o bien por una sentencia seguida del token ; y otra secuenciaDeSentencias. La figura 2 descompone todas las posibles sentencias que pueden Figura 3. sentenciaCase. aparecer en esta gramtica, y la figura 3 muestra el diagrama correspondiente a una de ellas: sentenciaCase. En toda gramtica existe un no terminal principal que representa a la gramtica en su conjunto, (que en nuestro ejemplo de Modula-2, representa una unidad de compilacin, y cuya figura no se muestra), de manera que, para reconocer una frase, se parte de su punto de entrada, y siguiendo algn camino en dicho diagrama, se llega a su punto de salida. Si dicho camino no existe, la frase se rechaza. Cuando en dicho camino nos encontramos con un no terminal, el flujo contina recursivamente a travs del diagrama asociado a ese no terminal. De esta forma, la aparicin de un no terminal en un diagrama se expande en otro diagrama que lo define. 2.1 Diagramas de sintaxis extendidos.

Como hemos visto, una secuencia de palabras se reconoce si y slo si hay un camino en los diversos diagramas de sintaxis que, partiendo inicio del diagrama inicial llega al final de dicho diagrama, pasando por una secuencia de tokens idntica a la secuencia a reconocer. Por ejemplo, el diagrama de la figura 4, reconoce como vlida la secuencia de tokens: dato , dato , dato ., ya que en el diagrama hay un camino que, pasando tres veces por dato, es capaz de ir desde el inicio (tringulo) hasta el final (tringulo invertido). La secuencia dato , , dato . no es vlida porque en ella hay dos comas seguidas, y ningn camino del diagrama pasa dos veces consecutivas por una coma. Figura 4. Diagrama de una lista de datos. Con este esquema es posible decidir si una frase es vlida o no, pero cmo podramos hacer para que el propio diagrama nos dijese al final (suponiendo la frase vlida) cuntas veces ha aparecido la palabra dato? Para ello, los diagramas se extienden con nodos de cdigo, que no son ms que nodos que, cuando se camina sobre ellos, realizan una accin u operacin. La figura 5 ilustra cmo es posible colocar nodos intermedios (representados por hexgonos) que realizan acciones cuando el flujo de reconocimiento pasa por ellos. De esta forma, tantas veces se pase por dato, t ant as veces se in c r e m e nt a r la variable cont, que se visualiza por pantalla justo antes de llegar al Figura 5. Diagrama con nodos de cdigo C intercalados. final de la regla.

DESCRIPCIN DE MEDISE.

MEDISE es un metacompilador que admite gramticas LL(1) descritas mediante diagramas de sintaxis extendidos y genera el correspondiente analizador sintctico escrito en lenguaje C. MEDISE ha sido desarrollado ntegramente en lenguaje Java, utilizando la herramienta Visual C@fe 2.0 for Java [VCJ97], que suministra algunos componentes grficos muy tiles, dando la posibilidad de incorporarlas a nuestros programas sin costo alguno. Como hemos adelantado, en MEDISE, se han incorporado dos nodos inexistentes en la definicin original de [CON63]: uno destinado a la gestin de errores, y otro a la incorporacin de acciones en lenguaje C. El primero es necesario ya que, durante la compilacin, el analizador debe indicar los problemas sintcticos encontrados, sin abortar la compilacin tras el primer error. El smbolo gestor de errores (llamado token de seguridad) permite establecer un control del tipo ignorar la entrada (panic mode [AHO86]), de forma que, ante una frase incorrecta, se van ignorando palabras hasta encontrar el token de seguridad, momento a partir del cual continua el reconocimiento del resto de la frase. El segundo ha sido introducido en el punto 2.1 y sirven para colocar bloques de cdigo que se ejecutan a medida que la ejecucin fluye por los diagramas. Adems, se han incorporado otros mecanismos que permiten la creacin completa de un compilador, as como la comunicacin necesaria entre el analizador sintctico y ele lexicogrfico, a travs del suministro del lexema leido.

3.1

INTERFAZ DE MEDISE.

MEDISE permite la introduccin de diagramas de Conway mediante una ventana dividida en 5 bloques principales distribudos verticalmente: barra de mens, barra de botones y propiedades, panel del diagrama, cuadro informativo y botones de cdigo global. El panel del diagrama visualiza en todo momento la regla o diagrama en edicin. Las caractersticas del panel se controlan mediante la barra de propiedades, pudindose ampliar o reducir el panel, modificar el tipo de letra empleado en cada smbolo independientemente, o

Figura 6. Ventana de la aplicacin MDC.

mostrar una rejilla que mejora estticamente la creacin del dibujo. La barra de botones, facilita la insercin y eliminacin de smbolos en el diagrama, as como la creacin de diagramas nuevos (llamados reglas en el contexto de MEDISE). Para permitir la incorporacin de nodos de cdigo, se tiene un botn etiquetado Nodo C. Los dos botones anexos al cuadro informativo, permiten especificar cdigo global al programa completo y cdigo local a cada regla; en ambos casos, el cdigo se ubicar al comienzo de su mbito. En caso de duda, se dispone de una ayuda completa sobre el funcionamiento de MEDISE (opcin Ayuda del men ?), y de un cuadro informativo textual que nos indica tanto el cometido de cada botn, como recomendaciones sobre la siguiente accin a realizar. La barra de mens complementa la herramienta con opciones sobre el tamao del panel, su orientacin, el color empleado para cada tipo de smbolo, etc. El men Metacompilacin permite obtener el analizador (escrito en lenguaje C estndar), o bien la notacin BNF correspondiente a cada regla. Estas opciones tambin estn disponibles en la barra de botones.

3.2

PASOS EN LA GENERACIN DE UN COMPILADOR. Los pasos a seguir en la construccin de un compilador resultan muy intuitivos: Construir las reglas que componen la gramtica mediante paneles, cada uno de los cuales deber estar asociado a un no terminal, y viceversa. Incluir las acciones semnticas (nodos C) que ejecuten las sentencias necesarias, as como incorporar los parmetros que sean necesarios y recuperar los valores devueltos. Asimismo, introducir los bloques de cdigo globales a todo el programa y a cada regla en particular. Los lexemas devueltos por el analizador lxico tambin pueden ser manejados en cdigo asociado a los terminales. Seleccionar la opcin Cdigo C del men de Metacompilacin. Si los diagramas han sido correctamente creados, nos aparecer en pantalla una ventana de texto conteniendo el cdigo C que implementa el analizador. Grabar el texto. Dado que MEDISE se ha construido para ser divulgado entre los estudiantes y utilizado a travs de Internet, est implementado como applet, tipo de programas que posee grandes restricciones por motivos de seguridad. Este hecho nos ha llevado a recomendar que cada alumno se descargue el applet en su propia mquina, con lo que podr disfrutar sin restricciones de las opciones de archivar y recuperar los diagramas de disco, grabar el cdigo C generado automticamente, as como disfrutar de las ventajas de ejecutar MEDISE dentro de un navegador como NetscapeTM o Internet ExplorerTM. Creacin mediante cualquier otra herramienta -Lex, Flex, etc.- o ad hoc, de un analizador lexicogrfico que suministre secuencias de tokens a nuestro programa. Tal analizador debe poseer una funcin principal llamada yylex() encargada del suministro.

3.3

FASES SEGUIDAS POR EL PROCESO DE GENERACIN

El proceso seguido por MDC para la obtencin del analizador sigue tres fases bien definidas: Obtencin de la expresin BNF correspondiente a cada regla.

Comprobacin de que la gramtica es LL(1), y no hay ciclos J. Generacin de cdigo. La expresin BNF se obtiene aplicando las reducciones de la figura 7. El objetivo que se persigue es la obtencin de un programa que simule en su flujo de ejecucin, el camino que habra que seguir (en los grafos de Conway) para reconocer o rechazar una sentencia del lenguaje. De esta forma: Cada regla da lugar a una funcin. Cada lnea de conexin da lugar a un cambio de flujo en el programa. Cada terminal da lugar al chequeo y consumo de un token. Cada no terminal da lugar a una llamada recursiva a la funcin que lo representa.
Entrada
. 

Reduccin resultante
B X
 / . 

AB

 /

. 

 /

(X|Y|...|Z)

Z
.  . 

A
.   /

[A]

A B

. 

A[BA]

 /

. 

 /

. 

{A} /

Figura 7. Reducciones para obtener la expresin BNF.

PROCESAMIENTO INTERNO DE LOS NODOS DE CDIGO

La incorporacin de cdigo a los diagramas de sintaxis puede realizarse de 6 formas bien diferenciadas: Introduciendo nodos C en el diagrama. Esta es la forma ms directa y visual de todas, y consiste en especificar nodos que contienen acciones escritas en C que se ejecutarn cuando el reconocimiento de la frase que se intenta validar obligue a pasar sobre dicho nodo. Estos nodos se introdujeron en la figura XX. Definiendo cdigo global a todo el compilador. Definiendo cdigo local a cada no terminal (segn el anlisis LL(1), cada no terminal se traduce en una funcin de C). Mediante la inclusin de parmetros reales en la llamada a funcin a que se traduce cada no terminal ubicado en una regla. Esto permite utilizar atributo heredados. Los parmetros formales se definen en cada regla.

Figura 8. Bloque de cdigo generados explcitamente por el usuario.

Mediante la recogida del valor devuelto por la llamada a funcin a que se traduce cada no terminal ubicado en una regla. Los atributos sintetizados se obtienen de esta manera. El valor devuelto se identifica en el smbolo finalizador de la regla del no terminal a que se llama. Mediante el lexema proporcionado por el analizador lexicogrfico, que puede ser recogido por cada terminal.

La figura8 ilustra un par de diagramas de sintaxis extendidos, as como el programa C generado. Las flechas relacionan los diferentes bloques de cdigo indicados explcitamente por el usuario, as como los elementos de la interfaz y de los diagramas que los han producido.

CONCLUSIONES.

MEDISE culmina el deseo de suministrar a los alumnos de asignaturas de Procesadores del lenguaje, una herramienta fcil de asimilar y que supone grandes beneficios a la hora de comprender el anlisis sintctico LL(1) y la generacin completa de compiladores. Actualmente, el software completo est disponible para quien lo desee en el fichero comprimido http://www.lcc.uma.es/personal/galvez/conway/mdc.zip que contiene, a su vez, el programa y la pgina web mdc.html. Esta pgina invoca automticamente a MEDISE en forma de applet local, permitiendo al usuario almacenar y recuperar los diagramas en su propia mquina. La posibilidad de especificar atributos y cdigo C en las reglas, eleva a MEDISE a la altura de otras herramientas de prototipado de compiladores, como Yacc y PCCTS. Slo la imaginacin del alumno y su inters por adquirir conocimientos sern capaces de sacar provecho a una herramienta eminentemente prctica, grfica y con caractersticas profesionales. La prxima versin de MEDISE refinar aspectos grficos (con objeto de evitar enrarecer excesivamente el diagrama de sintaxis original con demasiados nodos C), y realizar un mejor control del token de seguridad.

BIBLIOGRAFA.
[AHO86] [BEN90] [CON63] [GAL99] Aho, Sethi, Ullman: Compilers: Principles, Techniques and Tools, Addison-Wesley, 1986. Bennet, J.P.: Introduction to Compiling Techniques: A First Course using ANSI C, LEX and YACC, McGraw-Hill, 1990. Conway, M.E.: Design of a separable transition diagram compiler, Comm ACM, 296-408. 1963. Glvez, S., Tinaquero, D.: Generacin de Compiladores mediante Diagramas de Conway, Congreso Internacional de Informtica Educativa. Madrid (Espaa), 1999. Java Compiler Compiler Documentation. 1998 http://www.suntest.com/JavaCC/ Terence Parr, Henry Dietz: Purdue Compiler-Construction Tools Set.

[JAV98] [PAR90]

Technical Report TR-EE 90-14, SEE, Purdue Univ. IN. 1990. [VCJ97] [WIR88] Symantec Visual C@feTM for JavaTM. Users Guide, 1997. Wirth, N.: Programming in Modula-2, Springer-Verlag, 4th edition. 1988.