Você está na página 1de 21

FIUSAC Organizacin de lenguajes y compiladores 1 Seccion A Ing. Mario Bautista Aux.

Wener Aldana

Manual de CUP2

Jose Javier Cardona Polanco 200910523

Manual Introductorio de CUP2


Por Javier Cardona

ndice
Objetivos 4 Introduccin..5 Un Compilador.6 Acerca de CUP2.9 Acciones semnticas10 Creando y utilizando un parser12 Declaraciones de smbolos y definiendo reglas gramaticales. 12 Asignacin de acciones semnticas a las reglas gramaticales14 Eliminacin de ambigedad..14 Conexin con JFlex..16 Manejo y recuperacin de Errores16 Ejemplo...............17

Objetivos
Introducir los aspectos generales de CUP2 y orientar la instalacin. Facilitar el uso de CUP2. Ejemplificar el uso de las reglas gramaticales que maneja CUP2. Conectar con JFlex para poder estudiar los aspectos bsicos de un compilador.

Introduccin
El presente manual podrn encontrar una pequea introduccin a los compiladores y a su vez a los pasos que toma el compilador para analizar un archivo fuente. Si bien el objetivo de este manual no es profundizar en este tema se consider necesario el explorarlo para aquel lector que no tuviera los conocimientos bsicos. Se tom en cuenta el hecho de que es de mucho mas ayuda los ejemplos que la simple explicacin en texto plano, por lo que este manual contiene las explicaciones graficas que se consideraron necesarias. Al final de este manual podrn encontrar un ejemplo sencillo de una calculadora sencilla. La estructura final de un archivo CUP2 es muy parecido a CUP (versin 1) por lo que si ustedes tienen conocimientos previos podrn entender este ejemplo sin mucho anlisis. Si el lector tiene conocimientos previos sobre CUP, es bueno aclarar ahora que si bien el nombre CUP2 indica que esta es la versin 2 del mismo, esto no es as ya que cuando se creo CUP2 este fue reinventado completamente. Sinceramente espero que sea de su ayuda, disfruten el manual.

Un compilador
A grandes rasgos, un compilador es un programa que lee un programa escrito en un lenguaje (lenguaje fuente) y que lo traduce a un programa equivalente en otro lenguaje (lenguaje objeto), este lenguaje final por lo general es lenguaje de mquina. Como parte importante de ste proceso de traduccin, el compilador informa a su usuario de la presencia de errores en el programa fuente. Si nos ponemos a pensar, estamos diciendo que hay una enorme cantidad de compiladores hoy da. Hay miles de lenguajes fuente y tambin hay muchos lenguajes objeto. Esto nos deja con una cantidad de compiladores increblemente grande y nos da la idea de la necesidad de nuevos compiladores. Es por esto que la habilidad para realizar compiladores hoy da sigue siendo necesaria. A continuacin mostramos un diagrama bastante sencillo de lo que un compilador regular puede hacer.

Un compilador realiza esta labor de traduccin analizando el programa fuente en diferentes pasos. Para ello realiza este anlisis en dos etapas principales. La primera etapa analiza el programa fuente con un analizador lineal o lxico, un analizador jerrquico o sintctico y un analizador semntico.

Podemos visualizar de manera mas amplia y especifica los componentes de un compilador al ver el siguiente esquema que contiene todas las fases de un compilador.

Estas fases y analizadores se pueden realizar a mano programndolos con tcnicas ya establecidas y orientadas a nuestro lenguaje fuente. Pero tambin exisen generadores de analizadores lxicos y sintcticos. Uno de los generadores lxicos mas utilizados, al menos en la USAC, es JFlex que toma las especificaciones escritas en lenguaje de JFlex y las transforma y las devuelve como una clase Java que contiene nuestro analizador lxico.

Es mas aconsejable utilizar estas herramientas ya que ahorran mucho tiempo y el manejo de errores puede llegar a ser mucho mas sencillo que si lo programramos nosotros mismos. Un generador de analizadores sintcticos es CUP2, que toma reglas gramaticales de un lenguaje fuente y las transforma mediante mtodos como el LR(0), LALR(1) y LR(1) para dar como resultado dos clases Java que manejan nuestras gramticas segn nosotros las hayamos declarado. Representacin de un buen compilador.

Acerca de CUP2

Los desarrolladores de CUP2 considera que CUP2 es un sistema para la generacin de analizadores de especificaciones concisas. CUP2 est completamente escrito en Java y combina las ideas algortmicas de su predecesor CUP con las caractersticas de Java modernas. Mientras CUP soporta LALR (1) solamente, CUP2 incluye LR(0), LR (1) y LALR (1) de la caja y permite fciles extensiones para otras clases de gramtica. A diferencia de otros generadores de analizadores sintcticos tradicionales (incluyendo tambin CUP) CUP2 no crea cdigo fuente parser basado en un lenguaje de definicin de la gramtica independiente, sino que utiliza la API de Java, las llamadas se combina con las estructuras de datos para representar la informacin relacionada con la gramtica. Esto significa que no hay un lenguaje especial para definir gramticas y acciones semnticas, pero todo se hace en Java puro. An ms, CUP2 se exime de generar un analizador como un archivo de cdigo fuente, sino ms bien produce una corriente de cdigo Java serializado, que luego puede ser cargado por las clases de tiempo de ejecucin CUP2.

Definiendo Gramticas

Si tienes alguna relacin con la versin anterior de CUP (si cursaste el curso de compi1 en la USAC) es probable que te parezca conocida la forma de declarar las gramticas en CUP2 ya que utiliza recursos de java como los enums. Adems tambin utiliza, en mi opinin la mejor manera de declarar gramticas tipo 2, que es el BNF (Backus-Naur Form). BNF es un metalenguaje usado para expresar gramticas libres de contexto: es decir, una manera formal de describir lenguajes formales.

Como pequea introduccin definiremos algunas reglas de esta notacin. Regla gramatical Representacin en BNF No terminal <no_terminal > Terminal (se escribe en try negrita) Produce / Smbolo de ::= produccin Simbolo OR (<opcion1> | <opcion2> | <opcion3> ) <try>:: try <cuerpo_try> catch <cuerpo_catch> Produccin completa Rango de el abecedario de <rango_de_letras_minusculas> ::= [a-z] minsculas. Rango del abecedario en <rango_de_letras_minusculas> ::= [a-zA-Z] maysculas y minsculas.

A continuacin les presentamos un pequeo ejemplo de cmo definir un identificador tpico, que tiene como regla iniciar con una letra y puede seguir de muchos nmeros, letras y guiones bajos. < >= [ ] < >= [ ] < >=< > (< > | < > _ Para una mejor y ms extensa explicacin buscar en el libro del dragn y en Wikipedia.

Acciones semnticas.
Para realizar las acciones que tu gramtica tiene como objetivo realizar utilizamos estas acciones semnticas. Que constan en acciones que devuelven valores en reducciones de la gramtica que van produciendo los resultados para generar una accin final con los valores de nuestro archivo de entrada. Seguiremos utilizando los ejemplos del Manual de CUP2.

10

Para cada No Terminal tenemos que crear una clase que extienda de la clase SymbolValue<T>. Para el ejemplo que venimos trabajando declararamos las clases de la siguiente manera:

Una vez hecho esto podemos utilizar el metodo prod que habiamos mencionado antes con un argumento mas y este es el de la accin que queremos que realice. La estructura general del mtodo quedara de la siguiente manera:

11

Creando y Utilizando un parser.


Primero tenemos que crear la tabla de anlisis sintctico y luego somos capaces de inicializar el analizador con l. Esto se muestra en el siguiente listado.

Una vez creada nuestra LRParsingTable llamada tablichi a sta le mandamos un scanner que a su vez le mandara los tokens a la tabla para que sean analizados y ejecutadas sus acciones, como lo indicbamos en la seccin anterior.

Declaraciones de simbolos y definiendo reglas gramaticales


Como mencionbamos antes CUP2 utiliza enums para alojar a los terminales y a los no terminales de una gramtica. En el manual oficial de CUP2 podemos encontrar un clsico ejemplo que vemos desde que empezamos compiladores con el libro del dragn.

< >= ( < > + < > ) | < > < >= < > + < > | < >

< >= (

< > ) |

12

El equivalente de estas producciones para CUP2 seria el siguiente:

Para que esta produccin tenga sentido para CUP2 tenemos que declara los terminales y no terminales al igual que lo hacamos en anteriormente en CUP (versin 1). Declaracin de no terminales:

Declaracin de terminales:

13

Asignacin de acciones semnticas a las reglas gramaticales.


Con el fin de calcular cualquier valor o construir cualquier representacin de la entrada del analizador, necesitamos equipar el analizador con acciones semnticas. Las acciones semnticas en CUP2 son los mtodos de Java que contienen cdigo que se ejecuta cada vez que el parser decide reducir los smbolos hasta ahora reconocidos de acuerdo con una de sus reglas. Como habamos definido antes las acciones semnticas son las que se van a realizar cono objetivo final por nuestra gramtica. Las acciones se veran de la siguiente manera en un produccin cualquiera.

Eliminacin de ambigedad
Si bien CUP2 realiza varias tareas para eliminar la ambigedad el mismo esto no quiere decir que no pueda llevar a errores esta ambiguierdad. Una gramatica tipo 2 es ambigua si existe una cadena que tiene ms de una derivacin por la izquierda o ms de una derivacin por la derecha o si tiene dos o ms rboles de derivacin. En caso de que toda cadena tenga un nico rbol de derivacin, la gramtica no es ambigua.

14

Anteriormente utilizbamos uno de los ejemplos clsicos de el libro del dragon, que es del de la precedencia de multiplicacin sobre la suma. Ahora utilizaremos otro ejemplo clsico para ejemplificar la ambigedad de una gramtica al representar grficamente los arboles permitidos por esta misma gramtica. < >= < > + < > < >= < > < > < >= < >= Tenemos que la anterior gramtica nos puede producir estos dos rboles que como vemos son diferentes. El problema con que sean diferentes es que las acciones semnticas que mencionbamos antes serian afectadas porque las reducciones se realizaran sin estandarizacin.

Para eliminar esta ambigedad no existe un solo mtodo que lo solucione todo, lamentablemente. As que en muchos casos recae en nuestra habilidad como desarrolladores de compiladores y en nuestra experiencia desarrollando gramticas. Una de las soluciones que, por la experiencia, pueden funcionar es el agregar producciones y no terminales a nuestra gramtica para que sepa por que camino irse. Ya que el problema principal es que el compilador no va a saber que produccin tomar si es que viene una <E>. Podra tomar cualquiera de las dos primeras producciones. Podriamos replantear la gramatica de la siguiente manera. < > = < 2 > < 3 > | < 2 >= | < 3 >= + ) < > 15

Conexin con JFlex


Para conectar con CUP2 con JFlex es muy sencillo. Si ya tienes experiencia con CUP (versin 1) conectndolo con JFlex se te hara muy fcil ya que es igual con pequeas diferencias. Para ms informacin por favor consulta la documentacin de CUP2 y de JFlex. A continuacin una ejemplificacin de cmo se vera un .jflex

Manejo de y recuperacin de Errores.


Como mencionbamos en el inicio de este manual, el manejo y recuperacin de errores es una de las funciones principales del compilador, ya que esta indicara al usuario final en donde estn los errores que su programa fuente tiene indicndole los caracteres de error o el orden esperado de tokens. Para esto se necesita la posicin de los tokens o caracteres que provocan el error dentro del archivo fuente.

16

Aspecto importante de la construccin de analizadores con CUP2 es el apoyo a la recuperacin de errores sintcticos. En estos casos un analizador preparada simplemente se detiene con una excepcin. Sera muy til si el analizador intenta continuar con el anlisis en un punto, en el que est seguro de lo que se entiende o incluso trata de dar consejos, cmo corregir la entrada. El mtodo mas comn de recuperacin de errores y el que analizaremos en esta ocasin es el famoso modo pnico. Que lo que hace es que una vez encuentra un error en la gramtica empieza a ignorar todos los tokes que le sigan al error hasta que encuentre un token centinela y eso le indique que la instruccin a terminado y por tanto puede volver a empezar a analizar. Un ejemplo de la aplicacin de este metodoo es el siguiente (tomado del manual de CUP2).

17

A continuacin presento la compilacin de los ejemplos que he presentado. De los dos archivos JFlex y CUP2.

18

A esto se le tiene que sumar una clase principal para correrlo y la clase de analizador lxico que le envie los tokens. Ya que el principal objetivo de este manual no es dar ejemplos sino una introduccin y guiar al usuario para iniciarse en CUP2, te puedo recomendar que visites la pagina: https://www2.in.tum.de/repos/cup2/trunk/ Aqu podrs encontrar mucha mas documentacin y ejemplos. Espero que realmente este manual pueda ser de ayuda y que les haya gustado.

19

Conclusiones
CUP2 trata de una mejor manera el anlisis sintctico y de una manera mas directa con el lenguaje Java, utilizando directamente las estructuras para realizar las listas de los terminales y no terminales lo que te da un acceso mas directo a la construccin de tu parser. El uso de este tipo de herramientas es de gran ayuda tanto para el usuario que se dedica a construir compiladores como para nosotros los estudiantes que pretendemos entender las funciones de un compilador ya que se puede manipular de una manera muy cercana los componentes del compilador como lo es el parser. El manejo de errores es una de las herramientas mas importantes de un compilador y sin duda de mucha ayuda para el usuario final. Con CUP2 es bastante sencillo y poderosa la implementacin de esta herramienta.

20

Bibliografa
Technische Universitat Munchen. CUP2 User Manual [en lnea]. Alemania. [Consulta: 20 de mayo de 2013]. Disponible en: http://www2.in.tum.de/~petter/cup2/

Aho, Alfred V.; Ravi Sethi, Jeffrey D. Ullman (2008). Introduccin a la Compilacin. Compiladores: Principios, tcnicas y prcticas. Mxico: Addison Wesley.

Ruben Aldo, Kristan. Ambigedad en una Gramatica [en lnea]. Universal. [Consulta: 19 de mayo de 2013]. Disponible en: http://teodelacomp.blogspot.com/2011/03/37-eliminacion-de-laambiguedad.html

Archivo Wiki. Compilador [en lnea]. Universal. [Consulta: 18 de mayo de 2013]. Disponible en: http://en.wikipedia.org/wiki/Compiler

21

Você também pode gostar