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
´Indice
A. Problema del compilador a Desarrollar: 4
B. Aut´omata 4
C. Desarrollo del Compilador 4
1 . Crear el Analizador L´exico . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1 .1. Opciones y declaraciones . . . . . . . . . . . . . . . . . . . . . . . . 5
1 .2. C´odigo de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1 .3. Reglas lexicogr´aficas . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 . Crear la clase token . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 . Generaci´on del Archivo L´exico . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 . Crear el Analizador Sint´actico . . . . . . . . . . . . . . . . . . . . . . . . . 7
5 . Generar el Archivo Sint´actico . . . . . . . . . . . . . . . . . . . . . . . . . 9
6 . Integraci´on del Analizador L´exico y Sint´actico . . . . . . . . . . . . . . . . 9
7 . Control de Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
7 .1. Control de Errores del Analizador L´exico . . . . . . . . . . . . . . . 10
7 .2. Control de Errores del Analizador Sint´actico . . . . . . . . . . . . . 11
8 . Interfaz Gr´afica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
D. Anexos 17
E. BIBLIOGRAFIA 18
F. LICENCIA 19
´Indice de figuras
1. Aut´omata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Reglas Lexicogr´aficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3. Estructura de las Instrucciones del Analizador Sint´actico . . . . . . . . . . 8
4. Creaci´on de archivo.cup . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5. Integraci´on del Analizador L´exico Sint´actico . . . . . . . . . . . . . . . . . 9
6. M´etodo Escribir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
7. Constructor del Analizador L´exico . . . . . . . . . . . . . . . . . . . . . . . 10
8. Mensajes para mejor Interpretaci´on con el Usuario . . . . . . . . . . . . . . 11
9. Constructor del Analizador Sint´actico . . . . . . . . . . . . . . . . . . . . . 11
10. Mensajes presentados al Usuario . . . . . . . . . . . . . . . . . . . . . . . . 11
11. Identifica el error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
12. M´etodo report-fatal-error . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
13. Interfaz Gr´afica del Compilador . . . . . . . . . . . . . . . . . . . . . . . . 13
14. Funci´on que cumple cada Bot´on . . . . . . . . . . . . . . . . . . . . . . . . 14
15. Representaci´on de los Errores L´exicos . . . . . . . . . . . . . . . . . . . . . 15
16. Representaci´on de los Errores Sint´acticos . . . . . . . . . . . . . . . . . . . 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. Adem´as que contenga la estructura de
un programa de la siguiente manera
Inicio
Color Seleccionado
Cadena ingresada
Fin
B. Aut´omata
Como se representa en la Figura 1. del aut´omata la estructura que va a llevar el
compilador para su mejor entendimiento.
Figura 1: Aut´omata
C. Desarrollo del Compilador
El compilador se lo desarrollara en c´odigo java haciendo uso de las librer´ıas de JFLEX
y CUP por medio del IDE de desarrollo Netbeans. A continuaci´on detallaremos cada uno
de los pasos a seguir para la creaci´on de dicho compilador. Nota: Para el desarrollo del
presente proyecto se debe crear un proyecto nuevo de java en el IDE y luego importar las
debidas librer´ıas (jflex y cup );
4
1 . Crear el Analizador L´exico
Para el desarrollo del Analizador l´exico se debe tener presente las tres partes impor-
tantes por la que se encuentra conformado.
Secci´on 1: Opciones y declaraciones
Secci´on 2: C´odigo de usuario
Secci´on 3: Reglas lexicogr´aficas
1 .1. Opciones y declaraciones
La primera parte del archivo es el bloque donde se importaran los paquetes que se van
a utilizar para nuestro analizador en nuestro caso importaremos las siguientes librer´ıas y
escribimos el nombre del paquete correspondiente, donde la clase Symbol nos sirve para
devolver 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 llamar´a AzalizadorLexico.java
de tipo p´ublica y habilitamos %line y %column que nos permite obtener la l´ınea y la co-
lumna de la posici´on actual del compilador y el %cup que nos permite la integraci´on con
el archivo Cup.
1 .2. C´odigo de usuario
En esta secci´on de declarar el c´odigo que se va a utilizar, pero en nuestro caso no lo
utilizaremos, as´ı que pasamos a la reglas lexicogr´aficas.
1 .3. Reglas lexicogr´aficas
La Figura 2 una parte esencial dentro del funcionamiento del analizador, en este se
determinar´an el conjunto de expresiones regulares que se utilizar´an durante el proceso
de an´alisis, a continuaci´on se detalla las declaraciones utilizadas: Donde las variables de
Figura 2: Reglas Lexicogr´aficas
5
SaltoLinea y espacios son declarados para despu´es ignorarlos en el analizador Sint´actico,
ValorEntero y ValorTexto son el lenguaje que va a entender el compilador
LUEGO DECLARAMOS LOS OPERADORES Y SIGNOS A UTILIZAR
Donde cada una de ellas se encargan de retornar un nuevo objeto de tipo Symbol el mismo
que se encuentra estructurado de un valor entero y objeto de tipo token para asignar la
columna y l´ınea en la que se encuentra como adicional el valor del token correspondiente
como se representa a continuaci´on.
”,”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 RESERVADAS
Donde cada una de ellas se encargan de retornar un nuevo objeto de tipo Symbol el mismo
que se encuentra estructurado de un valor entero y objeto de tipo token para asignar la
columna y l´ınea en la que se encuentra como adicional el valor del token correspondiente
como se representa a continuaci´on.
((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 COMPILADOR
donde de la misma manera retornamos un objeto de tipo Symbol correspondiente para
cada valor donde recibe como par´ametro un valor entero y objeto de tipo token para
asignar la columna y l´ınea en la que se encuentra como adicional el valor del token co-
rrespondiente como se representa a continuaci´on.
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 car´acter invalido ingresado como la l´ınea y
la columna en la que se encuentre*/ . System.err.println(¸car´acter invalido- yytext() + ”[-
yyline + ”:- yycolumn + ”]”);
6
2 . Crear la clase token
Como se puede observar en la secci´on 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 del
token establecido, para que de esta manera despu´es se pueda acceder a cada uno de estos
atributos de la mejor manera y poder realizar las operaciones correspondientes.
3 . Generaci´on del Archivo L´exico
Una vez establecido el analizador l´exico se procede a la ejecuci´on 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 como
par´ametro el archivo Lexico.flex creado anterior mente .
4 . Crear el Analizador Sint´actico
Una vez establecido el analizador l´exico procedemos a realizar el analizador Sint´actico
el mismo que se encarga de estructurar el c´odigo y dar sentido a nuestras reglas l´exicas.
Creamos un archivo con el nombre de Sintactico.cup en el cual escribiremos todo
nuestro c´odigo del analizador Sem´antico.
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 siguiente
manera: package color; import java-cup.runtime.*; import java.util.ArrayList; im-
port java.io.FileReader;
Determinamos la secci´on del parser code : “c´odigo parser” : que contendr´a el c´odigo
java utilizado en nuestro caso sobre escribimos los m´etodos para la captura de errores
del 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 encontrado
public 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 un
error fatal. Donde se despliega el mensaje de error y se finaliza la ejecuci´on. por tal
motivo, capturamos esa excepci´on y presentamos un mensaje identificando el tipo de error
producido.
7
En la secci´on del action code realizamos una instancia de la clase instrucci´on la
misma que se la genera posteriormente, para guardar el tipo de instrucci´on a ejecutar
(cadena,color). action code : ArrayList¡Instruccion¿instrucciones = new ArrayList();
:
Terminales, tenemos dos tipos de terminales los que no tienen ning´un valor asociado
y los escribimos en la primera l´ınea y los de la segunda l´ınea son los que tienen alg´un
valor, como es el caso del valor entero para los colores y el valor del texto que hace
referencia 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 variables
que ser´an 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 c´odigo que indica donde inicia la estructura del programa para despu´es
desglosar 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 tokens
establecidos en la l´ınea anterior y Instrucciones donde se detalla en la Figura 3.
Figura 3: Estructura de las Instrucciones del Analizador Sint´actico
8
5 . Generar el Archivo Sint´actico
Una 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 representa
en la Figura 4:
Creamos una clase en java y escribimos el siguiente c´odigo
Figura 4: Creaci´on de archivo.cup
Donde String opciones[ ] nos permite asignar las caracter´ısticas necesarias para la com-
pilaci´on del archivo .cup, donde asignamos el paquete donde queremos que se genere el
archivo 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 respectivo
Sintactico.cup y con java-cup.Main realizamos la generaci´on correspondiente de la clase
AnalizadorSintactico.java y adem´as la clase sym que son generadas autom´aticamente.
6 . Integraci´on del Analizador L´exico y Sint´actico
Una vez creados cada uno de los analizadores se procede a la integraci´on de los dos
para dar sentido y estructura al compilador y final mente se procede realizar la estructura
sem´antica del compilador:
Integraci´on
Figura 5: Integraci´on del Analizador L´exico Sint´actico
9
M´etodo escribir() lo detallamos en la Figura 6 , EL mismo que me permite almacenar
en un archivo .txt lo que ingresamos por pantalla;
Figura 6: M´etodo Escribir
7 . Control de Errores
Luego se configura el AnalizadorL´exico y el Analizador Sint´actico para la captura de
Errores para definir la estructura sem´antica del compilador de la siguiente manera:
7 .1. Control de Errores del Analizador L´exico
De tal manera que se configuro el constructor del analizador l´exico (ver Figura 7.)
para poder enviar e interactuar con la interfaz gr´afica, donde se presenta y personaliza
los errores l´exicos.
Figura 7: Constructor del Analizador L´exico
10
Luego se personalizo cada uno de los mensajes (ver Figura 8.) para una mejor inter-
pretaci´on con el usuario e identifique que tipo de error se presenta, ingresando el valor
adecuado de error (token) en la columna y l´ınea actual en la que se encuentra de la
siguiente manera:
Figura 8: Mensajes para mejor Interpretaci´on con el Usuario
7 .2. Control de Errores del Analizador Sint´actico
Se configura los errores Sint´acticos para identificar si la sentencia ingresada se encuen-
tra bien estructurada y poder enviar los errores correspondientes. Personalizando cada
uno de ellos. (ver Figura 9.) Se Configura el constructor para la interacci´on con la vista
y poder presentar los mensajes de errores Y a continuaci´on se personaliza los mensajes
Figura 9: Constructor del Analizador Sint´actico
para presentarlos al usuario y determinar que tipo de error hay que corregir, presentando
por pantalla el error establecido como la l´ınea y la columna en la que se present´o dicho
error y adicional identificando que error se produjo como se representa en la Figura 10 y
Figura 11.
Figura 10: Mensajes presentados al Usuario
11
Figura 11: Identifica el error
Adicional se comenta la linea de codigo
System.exit(1) , (ver Figura 12);
en el m´etodo report-fatal-error(String message, Object info) debido a que si no lo hacemos
el compilador se cerrar´a repentina mente al encontrar un error.
Figura 12: M´etodo report-fatal-error
12
8 . Interfaz Gr´afica
Se realiza una interfaz gr´afica 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 interacci´on m´as
eficiente.
Figura 13: Interfaz Gr´afica del Compilador
13
En la Figura 14: Representa el Funcionamiento de cada uno de los Botones del Com-
pilador.
Figura 14: Funci´on que cumple cada Bot´on
14
En la Figura 15: Representa cada uno de los errores L´exicos indicando cuales Carac-
teres pertenecen y cuales no a la sintaxis.
Figura 15: Representaci´on de los Errores L´exicos
15
Figura 16: Representa cada uno de los errores Sint´acticos que procesa el compilador.
Figura 16: Representaci´on de los Errores Sint´acticos
16
D. Anexos
Para un mejor an´alisis y comprensi´on del compilador lo adjuntamos al proyecto java en
el siguiente repositorio: https://ralexs04@bitbucket.org/ralexs04/compiladorcambiacolor.
git
17
E. BIBLIOGRAFIA
Referencias
[1] “Integraci´on del JFlex y Cup Rafael.” Rafael A. Vega [Octubre 2008]
[2] “El Analizador L´exico, el Analizador Sintactico y los diferentes tipos de compiladores
que hay.” S. Galvez. M Mora.
[3] “Integraci´on del JFlex y Cup Rafael.” Luis Antonio. Farias Tello [17-01-2013]
18
F. LICENCIA
Ensayo by Ra´ul A . G´omez A. is licensed Under a Creative Commons Reconocimiento-
NoComercial-CompartirIgual 3.0 Unported License.
19

Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresada

  • 1.
    CIS-IXB-001 UNIVERSIDAD NACIONAL DE LOJA ´Area dela 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
  • 2.
    ´Indice A. Problema delcompilador a Desarrollar: 4 B. Aut´omata 4 C. Desarrollo del Compilador 4 1 . Crear el Analizador L´exico . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1 .1. Opciones y declaraciones . . . . . . . . . . . . . . . . . . . . . . . . 5 1 .2. C´odigo de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1 .3. Reglas lexicogr´aficas . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2 . Crear la clase token . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3 . Generaci´on del Archivo L´exico . . . . . . . . . . . . . . . . . . . . . . . . . 7 4 . Crear el Analizador Sint´actico . . . . . . . . . . . . . . . . . . . . . . . . . 7 5 . Generar el Archivo Sint´actico . . . . . . . . . . . . . . . . . . . . . . . . . 9 6 . Integraci´on del Analizador L´exico y Sint´actico . . . . . . . . . . . . . . . . 9 7 . Control de Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 7 .1. Control de Errores del Analizador L´exico . . . . . . . . . . . . . . . 10 7 .2. Control de Errores del Analizador Sint´actico . . . . . . . . . . . . . 11 8 . Interfaz Gr´afica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 D. Anexos 17 E. BIBLIOGRAFIA 18 F. LICENCIA 19
  • 3.
    ´Indice de figuras 1.Aut´omata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2. Reglas Lexicogr´aficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3. Estructura de las Instrucciones del Analizador Sint´actico . . . . . . . . . . 8 4. Creaci´on de archivo.cup . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 5. Integraci´on del Analizador L´exico Sint´actico . . . . . . . . . . . . . . . . . 9 6. M´etodo Escribir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 7. Constructor del Analizador L´exico . . . . . . . . . . . . . . . . . . . . . . . 10 8. Mensajes para mejor Interpretaci´on con el Usuario . . . . . . . . . . . . . . 11 9. Constructor del Analizador Sint´actico . . . . . . . . . . . . . . . . . . . . . 11 10. Mensajes presentados al Usuario . . . . . . . . . . . . . . . . . . . . . . . . 11 11. Identifica el error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12. M´etodo report-fatal-error . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 13. Interfaz Gr´afica del Compilador . . . . . . . . . . . . . . . . . . . . . . . . 13 14. Funci´on que cumple cada Bot´on . . . . . . . . . . . . . . . . . . . . . . . . 14 15. Representaci´on de los Errores L´exicos . . . . . . . . . . . . . . . . . . . . . 15 16. Representaci´on de los Errores Sint´acticos . . . . . . . . . . . . . . . . . . . 16 3
  • 4.
    A. Problema delcompilador 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. Adem´as que contenga la estructura de un programa de la siguiente manera Inicio Color Seleccionado Cadena ingresada Fin B. Aut´omata Como se representa en la Figura 1. del aut´omata la estructura que va a llevar el compilador para su mejor entendimiento. Figura 1: Aut´omata C. Desarrollo del Compilador El compilador se lo desarrollara en c´odigo java haciendo uso de las librer´ıas de JFLEX y CUP por medio del IDE de desarrollo Netbeans. A continuaci´on detallaremos cada uno de los pasos a seguir para la creaci´on de dicho compilador. Nota: Para el desarrollo del presente proyecto se debe crear un proyecto nuevo de java en el IDE y luego importar las debidas librer´ıas (jflex y cup ); 4
  • 5.
    1 . Crearel Analizador L´exico Para el desarrollo del Analizador l´exico se debe tener presente las tres partes impor- tantes por la que se encuentra conformado. Secci´on 1: Opciones y declaraciones Secci´on 2: C´odigo de usuario Secci´on 3: Reglas lexicogr´aficas 1 .1. Opciones y declaraciones La primera parte del archivo es el bloque donde se importaran los paquetes que se van a utilizar para nuestro analizador en nuestro caso importaremos las siguientes librer´ıas y escribimos el nombre del paquete correspondiente, donde la clase Symbol nos sirve para devolver 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 llamar´a AzalizadorLexico.java de tipo p´ublica y habilitamos %line y %column que nos permite obtener la l´ınea y la co- lumna de la posici´on actual del compilador y el %cup que nos permite la integraci´on con el archivo Cup. 1 .2. C´odigo de usuario En esta secci´on de declarar el c´odigo que se va a utilizar, pero en nuestro caso no lo utilizaremos, as´ı que pasamos a la reglas lexicogr´aficas. 1 .3. Reglas lexicogr´aficas La Figura 2 una parte esencial dentro del funcionamiento del analizador, en este se determinar´an el conjunto de expresiones regulares que se utilizar´an durante el proceso de an´alisis, a continuaci´on se detalla las declaraciones utilizadas: Donde las variables de Figura 2: Reglas Lexicogr´aficas 5
  • 6.
    SaltoLinea y espaciosson declarados para despu´es ignorarlos en el analizador Sint´actico, ValorEntero y ValorTexto son el lenguaje que va a entender el compilador LUEGO DECLARAMOS LOS OPERADORES Y SIGNOS A UTILIZAR Donde cada una de ellas se encargan de retornar un nuevo objeto de tipo Symbol el mismo que se encuentra estructurado de un valor entero y objeto de tipo token para asignar la columna y l´ınea en la que se encuentra como adicional el valor del token correspondiente como se representa a continuaci´on. ”,”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 RESERVADAS Donde cada una de ellas se encargan de retornar un nuevo objeto de tipo Symbol el mismo que se encuentra estructurado de un valor entero y objeto de tipo token para asignar la columna y l´ınea en la que se encuentra como adicional el valor del token correspondiente como se representa a continuaci´on. ((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 COMPILADOR donde de la misma manera retornamos un objeto de tipo Symbol correspondiente para cada valor donde recibe como par´ametro un valor entero y objeto de tipo token para asignar la columna y l´ınea en la que se encuentra como adicional el valor del token co- rrespondiente como se representa a continuaci´on. 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 car´acter invalido ingresado como la l´ınea y la columna en la que se encuentre*/ . System.err.println(¸car´acter invalido- yytext() + ”[- yyline + ”:- yycolumn + ”]”); 6
  • 7.
    2 . Crearla clase token Como se puede observar en la secci´on 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 del token establecido, para que de esta manera despu´es se pueda acceder a cada uno de estos atributos de la mejor manera y poder realizar las operaciones correspondientes. 3 . Generaci´on del Archivo L´exico Una vez establecido el analizador l´exico se procede a la ejecuci´on 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 como par´ametro el archivo Lexico.flex creado anterior mente . 4 . Crear el Analizador Sint´actico Una vez establecido el analizador l´exico procedemos a realizar el analizador Sint´actico el mismo que se encarga de estructurar el c´odigo y dar sentido a nuestras reglas l´exicas. Creamos un archivo con el nombre de Sintactico.cup en el cual escribiremos todo nuestro c´odigo del analizador Sem´antico. 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 siguiente manera: package color; import java-cup.runtime.*; import java.util.ArrayList; im- port java.io.FileReader; Determinamos la secci´on del parser code : “c´odigo parser” : que contendr´a el c´odigo java utilizado en nuestro caso sobre escribimos los m´etodos para la captura de errores del 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 encontrado public 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 un error fatal. Donde se despliega el mensaje de error y se finaliza la ejecuci´on. por tal motivo, capturamos esa excepci´on y presentamos un mensaje identificando el tipo de error producido. 7
  • 8.
    En la secci´ondel action code realizamos una instancia de la clase instrucci´on la misma que se la genera posteriormente, para guardar el tipo de instrucci´on a ejecutar (cadena,color). action code : ArrayList¡Instruccion¿instrucciones = new ArrayList(); : Terminales, tenemos dos tipos de terminales los que no tienen ning´un valor asociado y los escribimos en la primera l´ınea y los de la segunda l´ınea son los que tienen alg´un valor, como es el caso del valor entero para los colores y el valor del texto que hace referencia 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 variables que ser´an 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 c´odigo que indica donde inicia la estructura del programa para despu´es desglosar 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 tokens establecidos en la l´ınea anterior y Instrucciones donde se detalla en la Figura 3. Figura 3: Estructura de las Instrucciones del Analizador Sint´actico 8
  • 9.
    5 . Generarel Archivo Sint´actico Una 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 representa en la Figura 4: Creamos una clase en java y escribimos el siguiente c´odigo Figura 4: Creaci´on de archivo.cup Donde String opciones[ ] nos permite asignar las caracter´ısticas necesarias para la com- pilaci´on del archivo .cup, donde asignamos el paquete donde queremos que se genere el archivo 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 respectivo Sintactico.cup y con java-cup.Main realizamos la generaci´on correspondiente de la clase AnalizadorSintactico.java y adem´as la clase sym que son generadas autom´aticamente. 6 . Integraci´on del Analizador L´exico y Sint´actico Una vez creados cada uno de los analizadores se procede a la integraci´on de los dos para dar sentido y estructura al compilador y final mente se procede realizar la estructura sem´antica del compilador: Integraci´on Figura 5: Integraci´on del Analizador L´exico Sint´actico 9
  • 10.
    M´etodo escribir() lodetallamos en la Figura 6 , EL mismo que me permite almacenar en un archivo .txt lo que ingresamos por pantalla; Figura 6: M´etodo Escribir 7 . Control de Errores Luego se configura el AnalizadorL´exico y el Analizador Sint´actico para la captura de Errores para definir la estructura sem´antica del compilador de la siguiente manera: 7 .1. Control de Errores del Analizador L´exico De tal manera que se configuro el constructor del analizador l´exico (ver Figura 7.) para poder enviar e interactuar con la interfaz gr´afica, donde se presenta y personaliza los errores l´exicos. Figura 7: Constructor del Analizador L´exico 10
  • 11.
    Luego se personalizocada uno de los mensajes (ver Figura 8.) para una mejor inter- pretaci´on con el usuario e identifique que tipo de error se presenta, ingresando el valor adecuado de error (token) en la columna y l´ınea actual en la que se encuentra de la siguiente manera: Figura 8: Mensajes para mejor Interpretaci´on con el Usuario 7 .2. Control de Errores del Analizador Sint´actico Se configura los errores Sint´acticos para identificar si la sentencia ingresada se encuen- tra bien estructurada y poder enviar los errores correspondientes. Personalizando cada uno de ellos. (ver Figura 9.) Se Configura el constructor para la interacci´on con la vista y poder presentar los mensajes de errores Y a continuaci´on se personaliza los mensajes Figura 9: Constructor del Analizador Sint´actico para presentarlos al usuario y determinar que tipo de error hay que corregir, presentando por pantalla el error establecido como la l´ınea y la columna en la que se present´o dicho error y adicional identificando que error se produjo como se representa en la Figura 10 y Figura 11. Figura 10: Mensajes presentados al Usuario 11
  • 12.
    Figura 11: Identificael error Adicional se comenta la linea de codigo System.exit(1) , (ver Figura 12); en el m´etodo report-fatal-error(String message, Object info) debido a que si no lo hacemos el compilador se cerrar´a repentina mente al encontrar un error. Figura 12: M´etodo report-fatal-error 12
  • 13.
    8 . InterfazGr´afica Se realiza una interfaz gr´afica 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 interacci´on m´as eficiente. Figura 13: Interfaz Gr´afica del Compilador 13
  • 14.
    En la Figura14: Representa el Funcionamiento de cada uno de los Botones del Com- pilador. Figura 14: Funci´on que cumple cada Bot´on 14
  • 15.
    En la Figura15: Representa cada uno de los errores L´exicos indicando cuales Carac- teres pertenecen y cuales no a la sintaxis. Figura 15: Representaci´on de los Errores L´exicos 15
  • 16.
    Figura 16: Representacada uno de los errores Sint´acticos que procesa el compilador. Figura 16: Representaci´on de los Errores Sint´acticos 16
  • 17.
    D. Anexos Para unmejor an´alisis y comprensi´on del compilador lo adjuntamos al proyecto java en el siguiente repositorio: https://ralexs04@bitbucket.org/ralexs04/compiladorcambiacolor. git 17
  • 18.
    E. BIBLIOGRAFIA Referencias [1] “Integraci´ondel JFlex y Cup Rafael.” Rafael A. Vega [Octubre 2008] [2] “El Analizador L´exico, el Analizador Sintactico y los diferentes tipos de compiladores que hay.” S. Galvez. M Mora. [3] “Integraci´on del JFlex y Cup Rafael.” Luis Antonio. Farias Tello [17-01-2013] 18
  • 19.
    F. LICENCIA Ensayo byRa´ul A . G´omez A. is licensed Under a Creative Commons Reconocimiento- NoComercial-CompartirIgual 3.0 Unported License. 19