Este documento describe el desarrollo de un compilador simple para calcular el área de un trapecio. Explica la estructura de los archivos Flex y Cup que componen el analizador léxico y sintáctico, respectivamente. También incluye un ejemplo de entrada, las reglas gramaticales y los posibles errores. El objetivo es crear un compilador funcional que pueda calcular el área de un trapecio según la fórmula dada y los números de entrada provistos por el usuario.
1. CIS-IXB-001
UNIVERSIDAD
NACIONAL
DE LOJA
´Area de la Energ´ıa las Industrias y los Recursos Naturales No Renovables
Carrera de Ingenier´ıa en Sistemas
”Ejemplo del compilador ´Area de
un Trapecio”
Tarea - Extra Clase
9 ”B”
Autor:
• Byron Gonzalo Cabrera Gallardo
Docente: Ing. Henry-Paz
Loja-Ecuador
13/02/2015
1
3. A ´Area de un Trapecio
En el siguiente ejemplo se pretende resolver el ´area de un trapecio usando un compilador,
primero se ingresa la base mayor (B), base menor (b) y por ultimo la altura (h), como se
muestra en la f´ormula.
Figure 1: ´Area de un Trapecio
A continuaci´on detallaremos las VARIABLES y OPERADORES reservados.
• ”AreaTrapecio” : sirve para calcular el ´area.
• ”,” : sirve para separar los n´umeros ingresados
• Para el c´alculo correcto se deber´ıa ingresar de la siguiente manera: 5,4,5 AreaTrapecio
ERRORES
En caso de no ingresar correctamente los valores se presentaras los siguientes errores.
• Al ingresar letras: ERROR LEXICO, SOLO SE DEBEN INGRESAR NUMEROS
ENTEROS.
• Al ingresar decimales: ERROR LEXICO, SOLO SE DEBEN INGRESAR NU-
MEROS ENTEROS.
• Si falta alg´un n´umero, ya sea B,b,h: FAlTA EL TERCER NUMERO.
• Si falta la coma, ya sea en cualquier posici´on: FAlTA UNA COMA EN SEGUNDO
N´UMERO.
• Si no se coloca la palabra AreaTrapecio: FAlTA LA PALABRA RESERVADA
«AreaTrapecio».
RESULTADO
Si se ingresa todo correctamente el resultado seria.
• 6,4,2 AreaTrapecio
3
4. N´UMERO: 6
N´UMERO: 4
N´UMERO: 2
EL ´AREA DEL TRAPECIO ES: 10
*********** Fin de ejecuci´on **********
B Archivo Flex del ejemplo
A continuaci´on veremos como esta estructurado el archivo Flex.
Figure 2: Estructura del archivo Flex
Linea 5: Escribimos el paquete donde se encuentra nuestro archivo flex.
Linea 7-8: Importaci´on de paquetes.
Linea 10: Segunda secci´on.
Linea 13: Nombre de la clase.
Linea 15: Activar el contador de lineas, variable yyline.
4
5. Linea 16: Activar el contador de columnas, variable yycolumn.
Linea 17: Activar la compatibilidad con cup.
Linea 19,31: El c´odigo entre %{ y %} representa el c´odigo java que sera copiado en el
analizador l´exico.
Linea 22-24: Generamos un java cup.Symbol para guardar el tipo de token encontrado.
Linea 28-30: Generamos un Symbol para el tipo de token encontrado junto con su valor.
Figure 3: Estructura del archivo Flex
Linea 35: salto de linea.
Linea 36: Espacio en blanco, tabulador t, avance de pagina f.
Linea 37: n´umeros enteros.
Linea 39: tercera secci´on.
Linea 40,52: Es el estado inicial del analizador l´exico al escanear..
Linea 45: Regresa el token COMA declarado en la clase sym que fue encontrado.
Linea 46: Regresa el token finLinea declarado en la clase sym que fue encontrado.
Linea 47: Regresa el token NUMERO declarado en la clase sym que fue encontrado.
Linea 50: Ignora el espacio .
Linea 51: Si el token contenido en la entrada no coincide con ninguna regla entonces se
marca un token ilegal .
5
6. C Archivo Cup del ejemplo
A continuaci´on veremos como esta estructurado el archivo Cup.
Figure 4: Estructura del archivo Cup
Linea 3: Escribimos el nombre del paquete.
Linea 5,6: Importaci´on de paquetes.
Linea 9: Inicio del parser, c´odigo que flexibiliza el uso del parser, este c´odigo se incrusta
directamente en la clase parser.
Linea 13-25: M´etodo para reportar errores sint´acticos, este m´etodo encuentra el error lo
omite y continua con la ejecuci´on, recibe el mensaje y el valor de la informaci´on.
Linea 14: Inicializa una nueva instancia de la clase StringBuilder con la cadena especifi-
cada, guarda la cadena ”Error” en la variable m.
Linea 15: Comprueba que la informaci´on que se recibe sea de tipo simbol.
Linea 16: la informaci´on que se recibi´o la guardamos en la variable s.
Linea 17: Comprueba si la informaci´on symbol es mayor o igual a cero, pero en lado
izquierdo.
Linea 18: Concatena la palabra ”Error” con la frase ”in line”, y muestra en que linea se
encuentra el error.
Linea 19: Comprueba si la informaci´on symbol es mayor o igual a cero, pero en lado
derecho.
Linea 20: Concatena la palabra ”Error” con la frase ”column”, y muestra en que columna
se encuentra el error.
Linea 23: Concatena ”:” con el mensaje de error.
Linea 24: Imprime el error.
6
7. Figure 5: Estructura del archivo Cup
Linea 30-33: Este m´etodo sirve cuando se encuentra un error de donde el sistema no
puede recuperarse, se lanza un error fatal. Se despliega el mensaje de error y finaliza la
ejecuci´on, recibe el mensaje y el valor de la informaci´on.
Linea 31: Llama al m´etodo report error y le env´ıa los par´ametros.
Linea 32: Finaliza la ejecuci´on .
Linea 37-46: M´etodo main para garantizar la ejecuci´on del analizador l´exico y sint´actico,
recibe un String.
Linea 38: A˜nadimos la cl´ausula try y catch.
Linea 39: Creamos una instancia de la clase AnalizadorSintactico.
Linea 40: Sirve para leer el archivo txt.
Linea 41: Ejecutar el parse.
Linea 42: Imprime un mensaje.
Linea 49-53: M´etodo para calcular el ´area del trapecio,recibimos los tres par´ametros.
Linea 50: Inicializamos la variable en cero.
Linea 51: F´ormula del ´area del trapecio.
Linea 52: Imprime el resultado.
Linea 55: Fin del parser code.
7
8. Figure 6: Estructura del archivo Cup
Linea 58: Declaramos las terminales.
Linea 59: Declaramos las terminales de tipo Integer.
Linea 62: Declaramos las no terminales de tipo Object.
Linea 66: Inicia la expresi´on.
Linea 68: Verifica el primer numero, ” ,4,2 AreaTrapecio”.
Linea 69: Verifica la primera coma, ” 6 4,2 AreaTrapecio”.
Linea 70: Verifica el segundo numero, ” 6, ,2 AreaTrapecio”.
Linea 71: Verifica la segunda coma, ” 6,4 2 AreaTrapecio”.
Linea 72: Verifica el tercer numero, ” 6,4, AreaTrapecio”.
Linea 73: Verifica fin linea, ” 6,4,2 ”.
Linea 75: Llamamos al m´etodo calcular ´area y le enviamos los par´ametros.
D Clase main
A continuaci´on veremos como se ejecuta el compilador en la clase main.
Figure 7: Ejecutor main
8
9. Linea 5,6: Realizamos las importaciones.
Linea 13: Creamos el m´etodo main.
Linea 15: Guardamos la ruta del archivo Flex en la variable path.
Linea 16: Guardamos la ruta del archivo Cup en la variable ´area.
Linea 17: Guardamos la variable path en una array de tipo String.
Linea 18: Le asignamos a la variable sintac -parser, para que se ejecute el archivo Cup,
el nombre del archivo.java que se va a crear y la variable donde se encuentra la ruta del
archivo Cup.
Linea 19: M´etodo para ejecutar el archivo flex y crear el archivo.java.
Linea 20: M´etodo para ejecutar el archivo cup y crear los dos archivos.java.
Linea 22: Ruta de la entrada txt que va analizar el compilador.
Linea 23: Con este m´etodo enviamos el archivo txt al main del analizador sint´actico.
E Aut´omata del Compilador
A continuaci´on veremos el aut´omata del compilador, el cual acepta la entrada del archivo
txt. ejmeplo: 8,2,6 AreaTrapecio
Figure 8: Aut´omata del Compilador
En el siguiente link podemos encontrar el c´odigo fuente del compilador.
https://github.com/byron-cabrera-666/Compilador---Area-de-un-Trapecio
F Conclusiones
• El fundamental respetar la estructura de los archivos Jflex y Cup para que no existan
inconvenientes al momento de programar el compilador.
• El archivo Jflex proporciona a Cup todos los tokens seg´un los requiera.
• Cup es la herramienta principal de todo el proceso, se encarga de ir pidiendo a Jflex
los lexemas validos a analizar y genera el c´odigo necesario para el an´alisis sint´actico.
9
10. • Mediante el archivo Cup se puede ejecutar c´odigo java para realizar su trabajo de
an´alisis, dentro de las reglas de la gram´atica del lenguaje a compilar.
• Se puede desarrollar un compilador totalmente adaptado a nuestras necesidades
bas´andonos en la teor´ıa de compiladores.
References
[1] Rafael A Vega Castro, Integraci´on de Jflex y Cup (Analizadores lexico y sint´actico)),
2008, Disponible en: http://www.rafaelvega.com/wp-content/uploads/Articulo.pdf
[2] UNIVERSIDAD DE SEVILLA E. T. S. INGENIER´IA INFORM´ATICA, LENGUA-
JES Y SISTEMAS INFORM´ATICOS,2007, Disponible en: http://www.lsi.us.es/
docencia/get.php?id=5831
[3] Analizador l´exico, sint´actico y sem´antico con JFlex y CUP, Disponible en: http://
crysol.github.io/recipe/2007-12-10/analizador-lxico-sintctico-y-semntico-con-jflex-
#.VN0i4CuG-wQ
[4] Proyecto completo del Compilador, Disponible en: https://mega.co.nz/#!MxgTkZ7C!
ea-i8BhLuzgO4p4tyO6bikuHHrYCshQk7HuNMw0tm9Q
10