raúl a gómez a -> compilador cambia de color a una palabra ingresada

19
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 Compiladores Cambia de Color a una Palabra Ingresada Tarea- Extra Clase Noveno B Autor: Ra´ ul Alexander G´ omez Armijos Fecha: 13/02/2015 Docente: Ing. Henry-Paz, Loja-Ecuador 2015 1

Upload: raul

Post on 17-Jul-2015

69 views

Category:

Education


1 download

TRANSCRIPT

CIS-IXB-001

UNIVERSIDADNACIONALDE LOJA

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

Carrera de Ingenierıa en Sistemas

CompiladoresCambia de Color a una Palabra

Ingresada

Tarea- Extra ClaseNoveno B

Autor:

• Raul Alexander Gomez Armijos

• Fecha: 13/02/2015

Docente: Ing. Henry-Paz,

Loja-Ecuador2015

1

IndiceA. Problema del compilador a Desarrollar: 4

B. Automata 4

C. Desarrollo del Compilador 41 . Crear el Analizador Lexico . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1 .1. Opciones y declaraciones . . . . . . . . . . . . . . . . . . . . . . . . 51 .2. Codigo de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 .3. Reglas lexicograficas . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 . Crear la clase token . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 . Generacion del Archivo Lexico . . . . . . . . . . . . . . . . . . . . . . . . . 74 . Crear el Analizador Sintactico . . . . . . . . . . . . . . . . . . . . . . . . . 75 . Generar el Archivo Sintactico . . . . . . . . . . . . . . . . . . . . . . . . . 96 . Integracion del Analizador Lexico y Sintactico . . . . . . . . . . . . . . . . 97 . Control de Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

7 .1. Control de Errores del Analizador Lexico . . . . . . . . . . . . . . . 107 .2. Control de Errores del Analizador Sintactico . . . . . . . . . . . . . 11

8 . Interfaz Grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

D. Anexos 17

E. BIBLIOGRAFIA 18

F. LICENCIA 19

Indice de figuras1. Automata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42. Reglas Lexicograficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53. Estructura de las Instrucciones del Analizador Sintactico . . . . . . . . . . 84. Creacion de archivo.cup . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95. Integracion del Analizador Lexico Sintactico . . . . . . . . . . . . . . . . . 96. Metodo Escribir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107. Constructor del Analizador Lexico . . . . . . . . . . . . . . . . . . . . . . . 108. Mensajes para mejor Interpretacion con el Usuario . . . . . . . . . . . . . . 119. Constructor del Analizador Sintactico . . . . . . . . . . . . . . . . . . . . . 1110. Mensajes presentados al Usuario . . . . . . . . . . . . . . . . . . . . . . . . 1111. Identifica el error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1212. Metodo report-fatal-error . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213. Interfaz Grafica del Compilador . . . . . . . . . . . . . . . . . . . . . . . . 1314. Funcion que cumple cada Boton . . . . . . . . . . . . . . . . . . . . . . . . 1415. Representacion de los Errores Lexicos . . . . . . . . . . . . . . . . . . . . . 1516. Representacion de los Errores Sintacticos . . . . . . . . . . . . . . . . . . . 16

3

A. Problema del compilador a Desarrollar:Realizar un compilador que permita ingresar una cadena y que a dicha cadena ingre-

sada se cambie de color, por un color seleccionado. Ademas que contenga la estructura deun programa de la siguiente manera

Inicio

Color Seleccionado

Cadena ingresada

Fin

B. AutomataComo se representa en la Figura 1. del automata la estructura que va a llevar el

compilador para su mejor entendimiento.

Figura 1: Automata

C. Desarrollo del CompiladorEl compilador se lo desarrollara en codigo java haciendo uso de las librerıas de JFLEX

y CUP por medio del IDE de desarrollo Netbeans. A continuacion detallaremos cada unode los pasos a seguir para la creacion de dicho compilador. Nota: Para el desarrollo delpresente proyecto se debe crear un proyecto nuevo de java en el IDE y luego importar lasdebidas librerıas (jflex y cup );

4

1 . Crear el Analizador LexicoPara el desarrollo del Analizador lexico se debe tener presente las tres partes impor-

tantes por la que se encuentra conformado.

Seccion 1: Opciones y declaraciones

Seccion 2: Codigo de usuario

Seccion 3: Reglas lexicograficas

1 .1. Opciones y declaraciones

La primera parte del archivo es el bloque donde se importaran los paquetes que se vana utilizar para nuestro analizador en nuestro caso importaremos las siguientes librerıas yescribimos el nombre del paquete correspondiente, donde la clase Symbol nos sirve paradevolver un objeto del mismo tipo y poder obtener los valores correspondientes:

package color;import java-cup.runtime.Symbol;Declaramos las directivas y Macros%class AnalizadorLexico%public%line%column%cup

Donde especificamos que el nombre de la clase a generar se llamara AzalizadorLexico.javade tipo publica y habilitamos %line y %column que nos permite obtener la lınea y la co-lumna de la posicion actual del compilador y el %cup que nos permite la integracion conel archivo Cup.

1 .2. Codigo de usuario

En esta seccion de declarar el codigo que se va a utilizar, pero en nuestro caso no loutilizaremos, ası que pasamos a la reglas lexicograficas.

1 .3. Reglas lexicograficas

La Figura 2 una parte esencial dentro del funcionamiento del analizador, en este sedeterminaran el conjunto de expresiones regulares que se utilizaran durante el procesode analisis, a continuacion se detalla las declaraciones utilizadas: Donde las variables de

Figura 2: Reglas Lexicograficas

5

SaltoLinea y espacios son declarados para despues ignorarlos en el analizador Sintactico,ValorEntero y ValorTexto son el lenguaje que va a entender el compiladorLUEGO DECLARAMOS LOS OPERADORES Y SIGNOS A UTILIZARDonde cada una de ellas se encargan de retornar un nuevo objeto de tipo Symbol el mismoque se encuentra estructurado de un valor entero y objeto de tipo token para asignar lacolumna y lınea en la que se encuentra como adicional el valor del token correspondientecomo se representa a continuacion.

”,”return new Symbol(sym.COMA, new token(yycolumn, yyline, yytext()));”(”return new Symbol(sym.ABRIRPAR, new token(yycolumn, yyline, yytext()));”)”return new Symbol(sym.CERRARPAR, new token(yycolumn, yyline, yytext()));

SE DETALLA CADA UNA DE LAS PALABRAS RESERVADASDonde cada una de ellas se encargan de retornar un nuevo objeto de tipo Symbol el mismoque se encuentra estructurado de un valor entero y objeto de tipo token para asignar lacolumna y lınea en la que se encuentra como adicional el valor del token correspondientecomo se representa a continuacion.

((inicio¿”return new Symbol(sym.INICIO, new token(yycolumn, yyline, yytext()));((/fin¿”return new Symbol(sym.FIN, new token(yycolumn, yyline, yytext()));((cadena¿”return new Symbol(sym.CADENA, new token(yycolumn, yyline, yytext()));((color¿”return new Symbol(sym.COLOR, new token(yycolumn, yyline, yytext()));

Y AL FINAL LAS EXPRESIONES QUE IDENTIFICARA EL COMPILADORdonde de la misma manera retornamos un objeto de tipo Symbol correspondiente paracada valor donde recibe como parametro un valor entero y objeto de tipo token paraasignar la columna y lınea en la que se encuentra como adicional el valor del token co-rrespondiente como se representa a continuacion.

ValorTexto return new Symbol(sym.VALTEXT, new token(yycolumn, yyline, yytext()));ValorEntero return new Symbol(sym.VALINT, new token(yycolumn, yyline, yytext()));SaltoLinea return new Symbol(sym.ENTER, new token(yycolumn, yyline, yytext()));espacios /* ignorar *//*esta ultima lınea se encarga de presentar el caracter invalido ingresado como la lınea yla columna en la que se encuentre*/ . System.err.println(caracter invalido- yytext() + ”[-yyline + ”:- yycolumn + ”]”);

6

2 . Crear la clase tokenComo se puede observar en la seccion anterior se hace uso de una instancia de la

clase token, la misma que me permite almacenar la columna , la lınea y el nombre deltoken establecido, para que de esta manera despues se pueda acceder a cada uno de estosatributos de la mejor manera y poder realizar las operaciones correspondientes.

3 . Generacion del Archivo LexicoUna vez establecido el analizador lexico se procede a la ejecucion del mismo para que

se genere la clase AnalizadorLexico.java de la siguiente manera.

jflex.Main.generate(new File( ”src-File.separator+color- File.separator + ”Lexico.flex”));

donde jflex.Main.generate se importa de la librerıa JFlex el mismo que recibe comoparametro el archivo Lexico.flex creado anterior mente .

4 . Crear el Analizador SintacticoUna vez establecido el analizador lexico procedemos a realizar el analizador Sintactico

el mismo que se encarga de estructurar el codigo y dar sentido a nuestras reglas lexicas.

Creamos un archivo con el nombre de Sintactico.cup en el cual escribiremos todonuestro codigo del analizador Semantico.

Definimos el nombre del paquete donde se va a generar nuestro AnalizadorSentacti-co.java y importamos las librerıas necesarias a utilizar en nuestro caso de la siguientemanera: package color; import java-cup.runtime.*; import java.util.ArrayList; im-port java.io.FileReader;

Determinamos la seccion del parser code : “codigo parser” : que contendra el codigojava utilizado en nuestro caso sobre escribimos los metodos para la captura de erroresdel compilador.

public void syntax-error(Symbol sy)El mismo que determina si la sintaxis ingresada es la correcta.public void report-error(String message, Object info)Se encarga de dar un reporte de error en caso de ser encontradopublic void report-fatal-error(String message, Object info)report-error(message, info);System.exit(1);Cuando se encuentra un error de donde el sistema no puede recuperarse, se lanza unerror fatal. Donde se despliega el mensaje de error y se finaliza la ejecucion. por talmotivo, capturamos esa excepcion y presentamos un mensaje identificando el tipo de errorproducido.

7

En la seccion del action code realizamos una instancia de la clase instruccion lamisma que se la genera posteriormente, para guardar el tipo de instruccion a ejecutar(cadena,color). action code : ArrayList¡Instruccion¿instrucciones = new ArrayList();:

Terminales, tenemos dos tipos de terminales los que no tienen ningun valor asociadoy los escribimos en la primera lınea y los de la segunda lınea son los que tienen algunvalor, como es el caso del valor entero para los colores y el valor del texto que hacereferencia a la cadena.

terminal COMA,ABRIRPAR,CERRARPAR,INICIO,FIN,ENTER,COLOR,CADENA;

terminal token VALINT, VALTEXT;

No terminales, de la misma manera que los terminales pero son aquellas variablesque seran utilizadas para dar sentido y estructura al compilador

non terminal instrucciones, programa;

non terminal Instruccion instruccion,cadena,color;

Estructura del compilador : start with programa;

start with lınea de codigo que indica donde inicia la estructura del programa para despuesdesglosar su estructura de la siguiente manera.- programa ::= INICIO ENTER instrucciones ENTER FIN;Donde en programa indicamos que el compilador va a estar dado de cada uno de los tokensestablecidos en la lınea anterior y Instrucciones donde se detalla en la Figura 3.

Figura 3: Estructura de las Instrucciones del Analizador Sintactico

8

5 . Generar el Archivo SintacticoUna vez concluida la estructura del compilador procedemos a ejecutar el archivo.cup

para que se genere el .java y poder utilizarlo, de la siguiente manera como se representaen la Figura 4:

Creamos una clase en java y escribimos el siguiente codigo

Figura 4: Creacion de archivo.cup

Donde String opciones[ ] nos permite asignar las caracterısticas necesarias para la com-pilacion del archivo .cup, donde asignamos el paquete donde queremos que se genere elarchivo java, el nombre conque deseamos que se genere en este caso AnalizadorSintac-tico.java y luego el paquete donde se encuentra el archivo .cup y su nombre respectivoSintactico.cup y con java-cup.Main realizamos la generacion correspondiente de la claseAnalizadorSintactico.java y ademas la clase sym que son generadas automaticamente.

6 . Integracion del Analizador Lexico y SintacticoUna vez creados cada uno de los analizadores se procede a la integracion de los dos

para dar sentido y estructura al compilador y final mente se procede realizar la estructurasemantica del compilador:

Integracion

Figura 5: Integracion del Analizador Lexico Sintactico

9

Metodo escribir() lo detallamos en la Figura 6 , EL mismo que me permite almacenaren un archivo .txt lo que ingresamos por pantalla;

Figura 6: Metodo Escribir

7 . Control de ErroresLuego se configura el AnalizadorLexico y el Analizador Sintactico para la captura de

Errores para definir la estructura semantica del compilador de la siguiente manera:

7 .1. Control de Errores del Analizador Lexico

De tal manera que se configuro el constructor del analizador lexico (ver Figura 7.)para poder enviar e interactuar con la interfaz grafica, donde se presenta y personalizalos errores lexicos.

Figura 7: Constructor del Analizador Lexico

10

Luego se personalizo cada uno de los mensajes (ver Figura 8.) para una mejor inter-pretacion con el usuario e identifique que tipo de error se presenta, ingresando el valoradecuado de error (token) en la columna y lınea actual en la que se encuentra de lasiguiente manera:

Figura 8: Mensajes para mejor Interpretacion con el Usuario

7 .2. Control de Errores del Analizador Sintactico

Se configura los errores Sintacticos para identificar si la sentencia ingresada se encuen-tra bien estructurada y poder enviar los errores correspondientes. Personalizando cadauno de ellos. (ver Figura 9.) Se Configura el constructor para la interaccion con la vistay poder presentar los mensajes de errores Y a continuacion se personaliza los mensajes

Figura 9: Constructor del Analizador Sintactico

para presentarlos al usuario y determinar que tipo de error hay que corregir, presentandopor pantalla el error establecido como la lınea y la columna en la que se presento dichoerror y adicional identificando que error se produjo como se representa en la Figura 10 yFigura 11.

Figura 10: Mensajes presentados al Usuario

11

Figura 11: Identifica el error

Adicional se comenta la linea de codigoSystem.exit(1) , (ver Figura 12);en el metodo report-fatal-error(String message, Object info) debido a que si no lo hacemosel compilador se cerrara repentina mente al encontrar un error.

Figura 12: Metodo report-fatal-error

12

8 . Interfaz GraficaSe realiza una interfaz grafica como se presenta en la figura 13 que me permita inter-

actuar de la mejor manera con el usuario y poder obtener un resultado e interaccion maseficiente.

Figura 13: Interfaz Grafica del Compilador

13

En la Figura 14: Representa el Funcionamiento de cada uno de los Botones del Com-pilador.

Figura 14: Funcion que cumple cada Boton

14

En la Figura 15: Representa cada uno de los errores Lexicos indicando cuales Carac-teres pertenecen y cuales no a la sintaxis.

Figura 15: Representacion de los Errores Lexicos

15

Figura 16: Representa cada uno de los errores Sintacticos que procesa el compilador.

Figura 16: Representacion de los Errores Sintacticos

16

D. AnexosPara un mejor analisis y comprension del compilador lo adjuntamos al proyecto java en

el siguiente repositorio: https://[email protected]/ralexs04/compiladorcambiacolor.git

17

E. BIBLIOGRAFIA

Referencias[1] “Integracion del JFlex y Cup Rafael.” Rafael A. Vega [Octubre 2008]

[2] “El Analizador Lexico, el Analizador Sintactico y los diferentes tipos de compiladoresque hay.” S. Galvez. M Mora.

[3] “Integracion del JFlex y Cup Rafael.” Luis Antonio. Farias Tello [17-01-2013]

18

F. LICENCIA

Ensayo by Raul A . Gomez A. is licensed Under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

19