Post on 17-Jul-2015
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://ralexs04@bitbucket.org/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