compilador sobre conversión de unidades

22
CIS-IXB-004 UNIVERSIDAD NACIONAL DE LOJA ´ Area de la Energ´ ıa las Industrias y los Recursos Naturales No Renovables Carrera de Ingenier ´ ıa en Sistemas COMPILADOR QUE REALIZA CONVERSIONES ENTRE UNIDADES DE LONGITUD Y VOL ´ UMEN” Tarea- Extra Clase Noveno B Autor: Diego Vicente Guam´an Jima Docente: Ing. Henry-Paz. Loja-Ecuador 2015 1

Upload: diego-guaman-j

Post on 29-Jul-2015

51 views

Category:

Engineering


2 download

TRANSCRIPT

Page 1: Compilador sobre conversión de unidades

CIS-IXB-004

UNIVERSIDADNACIONALDE LOJA

Area de la Energıa las Industrias y los Recursos Naturales No Renovables

Carrera de Ingenierıa en Sistemas

COMPILADOR QUE REALIZACONVERSIONES ENTRE UNIDADES DE

LONGITUD Y VOLUMEN”

Tarea- Extra ClaseNoveno B

Autor:

• Diego Vicente Guaman Jima

Docente: Ing. Henry-Paz.

Loja-Ecuador2015

1

Page 2: Compilador sobre conversión de unidades

IndiceA. CASO DE ESTUDIO 3

B. AUTOMATA 3

C. COMPILADOR 51 . Analizador lexico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1 .1. Codigo del usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 .2. Seccion de opciones y declaraciones . . . . . . . . . . . . . . . . . . 51 .3. Reglas lexicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 . Analizador Sintactico y Semantico . . . . . . . . . . . . . . . . . . . . . . . 72 .1. Especificacion de librerıas . . . . . . . . . . . . . . . . . . . . . . . 82 .2. Codigo de Usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 .3. Lista de sımbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 .4. La gramatica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3 . Deteccion de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

D. RESULTADOS 20

E. CODIGO FUENTE 21

F. BIBLIOGRAFIA 22

Page 3: Compilador sobre conversión de unidades

A. CASO DE ESTUDIOEn el presente trabajo se explica y demuestra detalladamente la construccion de un

compilador, el mismo que esta orientado plenamente a la conversion entre unidades demedida de longitud y volumen. Para definir este compilador, primeramente se tuvo quedeterminar el lenguaje que se iba a utilizar, es decir las palabras reservadas, operadoresy fin de lınea, para este compilador el lenguaje de aceptacion esta definido de la siguienteforma:

En donde :

La unidad de medida esta definida por:

• Unidades de longitud: km,hm,dam,m,dm,cm,mm• Unidades de volumen: kmc,hmc,damc,mc,dmc,cmc,mmc. Se antepone al fi-

nal la ”c” con la finalidad de diferenciar la unidades de volumen de las unidadesde longitud

El operador esta dado por:

• Operador de unidad de longitud: convertirlong.• Operador de unidad de volumen: convertirvol.

Fin de lınea: En este compilador se identificara el fin de lınea con un ”;”.

Una vez conocido el lenguaje de aceptacion de nuestro compilador para el problemade conversion entre unidades de medida de longitud y volumen, se puede determinar quelas expresiones aceptadas para que este realice su funcion correctamente, en los dos casosposibles de longitud o volumen, deben ser, por ejemplo:

5 km convertirlong m;o

25 cmc convertirvol mmc;

B. AUTOMATAAntes de empezar a la construccion del compilador, se debe tener muy claro la logica

del funcionamiento del mismo, esto se logra mediante la creacion del automata. Con elautomata se puede modelar mas claramente como sera la estructura funcional de este, yaque permite determinar cual sera el procesamiento del compilador al analizar una cadenade entrada, conociendo los resultados que deberıa arrojar y sobre todo los posibles erroresque se pueden sucitar.

3

Page 4: Compilador sobre conversión de unidades

4

Page 5: Compilador sobre conversión de unidades

C. COMPILADORUna vez definido el problema y entendido la funcionalidad del mismo con ayuda del

automata, se procede a la construccion del compilador, para ello se debe tener en cuentala estructura de este, la cual es:

Analizador lexico => archivo.jflexAnalizador sintactico y semantico => archivo.cup

1 . Analizador lexicoEl analizador lexico permite especificar el lenguaje o alfabeto que va a reconocer y

aceptar mi compilador, es la parte inicial en la construccion de un compilador, para ellose utiliza un archivo de texto plano con la extencion .flex, con la siguiente estructura:

Codigo del usuario% %

Seccion de opciones y declaraciones% %

Reglas lexicas

1 .1. Codigo del usuario

En esta seccion del archivo flex, especifıcamos las librerıas que se van a utilizar en laclase java que se va a generar.

1 .2. Seccion de opciones y declaraciones

En esta parte detallamos las opciones que seran necesarias para el compilador y lasdeclaraciones que consiste en la especificacion del codigo java que se copiara directamentea la clase que se generara y las expresiones regulares (secuencia de caracteres simples oespeciales) que utilizara el compilador.

5

Page 6: Compilador sobre conversión de unidades

1 .3. Reglas lexicas

Aqui especificamos los tokens que se van a utilizar, un token es un identificador, unoperador o una palabra reservada para un determinado lenguaje, para este compilador sedefinen los siguientes tokens:

Tokens para unidades de longitud : km,hm.dam,m,dm,cm,mm.

Tokens para unidades de volumen : kmc,hmc,damc,mc,dmc,cmc,mmc

Tokens para operadores : convertirlong, convertirvol.

Token para fin de lınea : ;

Token definidos por las expresiones regulares : Numero,Espacio

6

Page 7: Compilador sobre conversión de unidades

Finalmente para compilar el archivo .flex, necesitamos tener agregada la librerıa jflexen nuestro proyecto y la escribir la siguiente lınea de codigo:

En donde el metodo generate(), sera el encargado de crear la clase java que especificamosen el archivo .flex, para este caso se le puso el nombre AnalizadorLexico. [1]

2 . Analizador Sintactico y SemanticoEn esta parte basicamente especificamos la gramatica que analizara nuestro compi-

lador en su entrada y sobre todo que esta tenga sentido para el problema que vamosa solucionar, para ello utilizamos un archivo con extension .cup que esta divido en lassiguientes secciones:

7

Page 8: Compilador sobre conversión de unidades

Especificacion de librerias

Codigo de usuario

Lista de sımbolos de la gramatica

La gramatica

2 .1. Especificacion de librerıas

Aqui especificamos las librerıas que va a utilizar la clase que se va a generar del archivo.cup

2 .2. Codigo de Usuario

Aqui se determina el codigo java que va a utilzar la clase que se va a generar, estecodigo java se copiara directamente a dicha clase, en donde:

Primeramente especificamos los metodos para encontrar los errores sintacticos ennuestras entrada, en esta parte se realizan 2 metodos, el primero denominado re-port error nos sirve para detectar errores en la parte gramatical de las entradas in-gresadas, en donde podemos personalizar los mensajes de error para que sea mas en-tendible y facil de corregir, el segundo metodo que se emplea es report fatal errorel cual es utilizado para errores graves en que el compilador no pueda recuperarcey seguir con la ejecucion.

A continuacion se muestra la codificacion de estos dos metodos de error, en dondela parte de la deteccion y personalizacion de los mensajes de error se la explicaramas adelante.

8

Page 9: Compilador sobre conversión de unidades

Seguidamente especificamos el metodo main para garantizar la ejecucion del ana-lizador lexico y sintactico, en donde la variable result, es en sı la que guardara laconversion o error que enviara la gramatica que se especificara mas adelante.

9

Page 10: Compilador sobre conversión de unidades

Finalmente realizamos los metodos necesarios para realizar la conversion entre lasunidades de longitud y de volumen, estos metodos seran llamados en la parte gra-matical para realizar las respectivas conversiones.

10

Page 11: Compilador sobre conversión de unidades

11

Page 12: Compilador sobre conversión de unidades

12

Page 13: Compilador sobre conversión de unidades

2 .3. Lista de sımbolos

En esta parte se declaran los sImbolos terminales y no terminales para nuestro com-pilador, en donde:

SImbolos terminales : Son los tokens obtenidos y especificados en el analizadorlexico, es importante tener en cuenta que los sımbolos terminales que no tienen unvalor son listados primero y los que tienen valor como el NUMERO de tipo Doubleson listados despues.

SImbolos No terminales : Los sımbolos no terminales son utilizados para especi-ficar la parte gramatical de nuestro compilador, igualmente como en los terminaleses importante aclarar que primero se lista los no terminales que tienen un valor Ob-ject y despues se lista los no terminales que tienen un valor como un entero, ya queun Object se refiere a que no tienen tipo, pudiendo ser entero, String, decimal,etc.

2 .4. La gramatica

Se podrıa decir que esta es la parte principal de nuestro compilador, ya que es aquıen donde especificamos la logica y semantica para las entradas que va a procesar nuestrocompilador, en donde:

Primeramente se determina la gramatica raız, que en este caso es expr1, en la cual seindica que esta va a estar compuesta por una lista de expresiones o por una expresionparcial, denotada para este caso como expr2, que es donde se va a presentar elresultado de la conversion que se haya realizado, entre {: java :} se coloca el codigoen java para las acciones a tomar.En la expr2 podemos denotar que existe un control o deteccion de error para lasentradas que no tengan fin de lınea, esto se explicara mas adetalle en la parte dedeteccion de errores.[2]

13

Page 14: Compilador sobre conversión de unidades

Seguidamente especificamos cual sera la gramatica que aceptara el compilador, endonde se llamara a los metodos de conversion de las unidades que se mostraronanteriormente, tambien se determinaron gramaticas que sirvieron para el control deerrores que se explicara mas adelante.

14

Page 15: Compilador sobre conversión de unidades

Finalmente para la compilacion del archivo .cup se necesita primeramente tener lalibreria jcup anadido al proyecto java y las siguientes lıneas de codigo:

15

Page 16: Compilador sobre conversión de unidades

3 . Deteccion de erroresPara la deteccion de errores se utilizo el metodo report error indicado anteriormente y

la parte gramatical, en donde se pusieron las condiciones necesarias para que el compiladorpresente un mensaje de error entendible para el usuario y este pueda corregirlo masrapidamente.

En el metodo report error como se muestra a continuacion se pusieron varias condi-ciones, con la finalidad de atrapar los errores mas relevantes y posiblemente los mascomunes que se pueden dar al momento de ingresar las entradas que el compiladorva analizar.

16

Page 17: Compilador sobre conversión de unidades

El valor entero de s.sym que se obtiene y compara en cada una de las condiciones,se lo llama de la clase sym generada al compilar el archivo .cup, en esta clase se encuen-

17

Page 18: Compilador sobre conversión de unidades

tran todos lo sımbolos no terminales que especificamos en el archivo, como se muestra acontinuacion

Otros errores tambien se detectaron directamente en la parte gramatical, en dondese creo un atributo de tipo symbol, para guardar el valor del sımbolo que en estecaso esta dando error, a continuacion se muestra la deteccion de errores en el noterminal sentencia que es donde se analiza en si las entradas ingresadas

18

Page 19: Compilador sobre conversión de unidades

Las variables con las que se trabaja en este caso para la deteccion de errores en lagramatica y para la variable simboloError, son variables que se generan con la clasejava al compilar el archivo .cup, las cuales permiten obtener el valor del sımbolo que estadando error y los sımbolos que estan en la izquierda y derecha del mismo.

El uso de estas variables es muy importante al hacer deteccion de errores en esta partedel archivo cup

19

Page 20: Compilador sobre conversión de unidades

D. RESULTADOSA continuacion se presentan los resultados finales del compilador, al ejecutarlo

Archivo de texto con entradas correctas

Resultado

Entrada incorrecta

Deteccion de error

20

Page 21: Compilador sobre conversión de unidades

E. CODIGO FUENTEEn el siguiente enlace se encuentra el proyecto de java completo, donde se puede

encontrar todos los archivos que se utilizaron para realizar este compilador.

DIEGO-GUAMAN. Codigo fuente del compilador de conversion de unidades de lon-gitud y volumen”. 9/02/2015.[en lınea] Disponible en: https://code.google.com/p/compilador-conversion-unidades-longitud-volumen-flex-cup/source/browse/#svn%2Ftrunk%2FEjemploCUP_DG

21

Page 22: Compilador sobre conversión de unidades

F. BIBLIOGRAFIA

Referencias[1] ORTEGA-JOSUE. Estrutura del archivo flex ”. 10/02/2015.[en lınea] Disponible en:

https://openfecks.wordpress.com/jlex-y-cup/plantilla-archivo-jlex/

[2] CUP. Estrutura del analizador sintactico y archivo cup ”. 10/02/2015.[en lınea] Dispo-nible en: http://www.cs.princeton.edu/˜appel/modern/java/CUP/manual.html

22