Compilador para la generación de código a partir de las iniciales de los nombres de una persona
1. CIS-IXB
UNIVERSIDAD
NACIONAL
DE LOJA
´Area de la Energ´ıa las Industrias y los Recursos Naturales No Renovables
Carrera de Ingenier´ıa en Sistemas
“Compilador para la Generaci´on de
C´odigo a partir de las iniciales de los
Nombres de una persona”
Noveno B
Autor:
Mora-Medina,Ana-Cristina
Docente:
Ing. Paz, Henry
Loja-Ecuador
2015
Compilador para la Generaci´on de C´odigo a partir de las iniciales de los Nombres de una
persona by Mora Ana is licensed Under a Creative Commons Reconocimiento-
NoComercial-CompartirIgual 3.0 Unported License.
1
3. A. Caso Pr´actico
El problema a resolver a trav´es del presente compilador consiste en que al ingresar
una cadena con los nombres completos de una persona, de la que se proceder´a a extraer
la primera letra de cada nombre, con las cuales se generar´a un c´odigo con las iniciales del
nombre ingresado, cabe recalcar que el c´odigo generado se presentar´a en may´usculas sin
importar si los nombres fueron ingresados en may´usculas o min´usculas.
Para lo antes mencionado la cadena a ingresar con los nombres completos de la persona
deber´a cumplir con ciertas condiciones que se describen a continuaci´on:
Al ingresar los dos nombres y apellidos, estos pueden estar en min´usculas, may´uscu-
las o la primera inicial con may´usculas.
Los nombres no deben contener ning´un car´acter especial o n´umeros como parte de
la cadena ingresada.
Al final de los nombres completos de la persona debe ingresarse un punto y coma
(;)
Por ejemplo la cadena con los nombres completos de la persona puede ingresarse de las
siguientes formas:
Rosa Mar´ıa Tene Pineda;
ROSA MAR´IA TENE PINEDA;
rosa mar´ıa tene pineda;
rOSA mar´ıa Tene PInEDA;
obteni´endose el c´odigo siguiente: RMTP para cualquier forma que haya sido ingresada
la cadena.
3
4. B. Aut´omata
De acuerdo al problema a resolver se ha desarrollado el aut´omata determinista que se
presenta en la Figura 1, este aut´omata est´a compuesto por 3 estados, los cuales se detallan
a continuaci´on:
Un estado inicial, el mismo que permitir´a evaluar si la cadena de entrada es co-
rrecta, dando as´ı paso al siguiente estado, este cadena comprender´a las letras del
alfabeto espa˜nol tanto may´usculas como min´usculas [a-zA-Z] y todas sus posibles
combinaciones, adem´as de espacios.
1 estado intermedio, el cual tomar´a valores las letras del alfabeto espa˜nol tanto
may´usculas como min´usculas [a-zA-Z] y todas sus posibles combinaciones, adem´as
de espacios.
Un estado de aceptaci´on, el cual corresponde al fin de entrada de la cadena repre-
sentado por el punto y coma.
Figura 1: Aut´omata
C. Analizador L´exico
El analizador l´exico es la primera fase de un compilador, el cual se encarga de leer el
flujo de caracteres de entrada y transformarlos en una secuencia de componentes l´exicos
los mismos que ser´an utilizados posteriormente por el analizador sint´actico.
Con esta breve descripci´on de lo que es un analizador l´exico, a continuaci´on se proce-
der´a a explicar las diferentes partes que componen la estructura b´asica del archivo FLEX.
1 . C´odigo de usuario
En esta parte del archivo se coloca el c´odigo Java que se usar´a en la clase que se
ser´a generada por nuestro analizador, por lo general en esta secci´on se colocan todos los
imports a otras librer´ıas. Ver Figura 2.
package ejemplocup: Representa el nombre del paquete en el que se esta realizando
el ejemplo.
import java cup.runtime.∗: Esta l´ınea permite que se realice la ejecuci´on en pa-
ralelo del analizador l´exico y analizador sint´actico.
4
5. import java.io.Reader: Permite realizar la lectura de un archivo desde java.
Figura 2: C´odigo de Usuario
2 . Opciones y Declaraciones
La secci´on de opciones y declaraciones est´a compuesta por un conjunto de par´ame-
tros que permiten indicar al analizador l´exico como debe comportarse, para ello cada
par´ametro especificado debe empezar con el s´ımbolo % y debe escribe s´olo uno por l´ınea.
A continuaci´on se describe cada uno de los par´ametros que debe contiene la secci´on de
opciones y declaraciones que se presentan en la Figura 3.
% % El s´ımbolo de porcentaje doble que se encuentra al inicio y fin de la Figura
3. indica que las l´ıneas que se encuentran dentro de estos s´ımbolos corresponden al
bloque de configuraci´on del analizador l´exico.
% class AnalizadorLexico: Con esta l´ınea podemos cambiar el nombre de la clase
que genera por defecto el analizador l´exico. En este caso el nombre que tomar´a la
clase ser´a: AnalizadorLexico.
%line y %column: Estas dos l´ıneas le indican al analizador que lleve el conteo de
la l´ınea y columna que esta analizando.
%cup: Con esta l´ınea activamos la compatibilidad del analizador l´exico con Java
CUP para los analizadores sint´acticos(parser).
M´etodos Symbol: Los m´etodos Symbol son los encargados de generar un java cup
.Symbol para guardar el tipo de token encontrado, as´ı la posici´on de la l´ınea y
columna en que est´a dicho token.
Cadena y spacio: Estas corresponden a las declaraciones de las expresiones que
formaran parte de nuestro analizador l´exico. Tenemos Cadena va a estar dada por
cualquier combinaci´on de letras comprendidas entre a-z min´usculas y A-Z may´uscu-
las, mientras spacio nos indica que podr´a ingresar espacios en la cadena a analizar.
5
6. Figura 3: Opciones y Declaraciones
3 . Reglas L´exicas
En esta secci´on del archivo Flex, se definen las reglas l´exicas que va a tener nuestro
archivo Flex y a trav´es de las cuales se podr´a obtener los tokens de la cadena que se esta
leyendo. A continuaci´on se realiza la explicaci´on de los diferentes m´etodos que se pueden
apreciar en la Figura 4.
YYINITIAL Corresponde al estado l´exico inicial del esc´aner, con el cual se se
empieza a escanear. Si una expresi´on regular no tiene condici´on inicial, ser´a evaluada
en cualquier estado l´exico que se encuentre el esc´aner.
M´etodos yytext(), yyline y yycolum: Estos m´etodos retornan el token encontrado,
junto al valor de la l´ınea y columna en que se encuentra el token dentro de la cadena
ingresada, la cual esta siendo analizada por el analizador l´exico.
Punto (.): Con el punto se eval´ua si el token contenido en la entrada no coincide
con ninguna regla l´exica y lo marca como un token ilegal.
6
7. Figura 4: Reglas L´exicas
Una vez explicada cada una de las secciones que componen el analizador l´exico, se
presenta finalmente en la Figura 5. la estructura del archivo Flex del problema descrito
en la secci´on anterior.
7
8. Figura 5: Estructura Final Archivo FLEX
D. Analizador Sint´actico
El analizador sint´actico (parser) es el encargado de recibir los tokens y determinar
si la cadena puede ser generada para la gram´atica que especifiquemos dependiendo del
problema que vamos a resolver. La estructura que debe tener el archivo CUP se detalla a
8
9. continuaci´on:
1 . Definici´on de paquetes e importaci´on de paquetes necesarios
En esta secci´on del archivo se incluyen todos los paquetes e importaciones del c´odigo
Java que se usar´a para las clases que ser´an generadas a partir del archivo sint´actico. A
continuaci´on se detallan cada uno de los par´ametros presentes en la Figura 6.
package ejemplocup: Representa el nombre del paquete en donde se crear´a la clase
java de este archivo.
import java cup.runtime.∗: Esta l´ınea es importante ya que permitir´a que se
ejecute paralelamente el analizador l´exico y analizador sint´actico.
import java.io.FileReader: La importaci´on de esta clase permite realizar la lec-
tura de un archivo desde java.
Figura 6: Definici´on de Paquetes e Importaciones
2 . Secci´on de C´odigo de usuario
En esta secci´on se realizan declaraciones opcionales de c´odigo java que va a utilizar
la clase que se generar´a a partir del archivo sint´actico. A continuaci´on se da una breve
descripci´on del c´odigo que se detalla en el parser code que se aprecia en la Figura 7.
report error(String message, Object info): Permite controlar los errores de
nuestro compilador.
• La l´ınea StringBuilder m = new StringBuilder(”Error”);, Se crea para enviar
el mensaje de error en la fila y columna en que se encuentre el error.
• La condici´on if (info instanceof java cup.runtime.Symbol), permite verificar si
el token no se encuentra dentro de los establecidos en nuestro analizador l´exico,
lanza el mensaje de error con el n´umero de fila y columna en que se encuentre
el error.
• String valor=info.toString()+””;, asigna a la variable el valor de info.
• String[] val vec=valor.split(”#”);, crea un vector con los datos de la cadena
valor
• La condici´on if(Integer.parseInt(val vec[1])==sym.EOF) eval´ua si el dato al-
macenado en la posici´on 1 del vector es igual al s´ımbolo EOF y presenta el
mensaje cuando falta fin de l´ınea.
9
10. • La condici´on if(Integer.parseInt(val vec[1])==sym.PALABRA) eval´ua si el da-
to almacenado en la posici´on 1 del vector es igual al s´ımbolo PALABRA y
presenta el mensaje cuando la palabra contiene caracteres especiales o n´ume-
ros.
report fatal error(String message, Object info: Este m´etodo se ejecuta cuan-
do se encuentra un error del cual el sistema no puede recuperarse, lanz´andose error
fatal. Para ello llama al m´etodo report error(String message, Object info), desple-
gando el mensaje de error y se finalizando la ejecuci´on.
main(String[] args) : A partir del m´etodo main se procesar´a el archivo de entrada
txt, el cual contiene la cadena que ser´a evaluada por el compilador.
Figura 7: Secci´on de C´odigo de usuario
3 . Declaraci´on de s´ımbolos terminales y no terminales
En esta secci´on se realiza la declaraci´on de los s´ımbolos terminales y no terminales de
la gram´atica que se define en el analizador sint´actico que se esta generando a partir de
este archivo.
10
11. S´ımbolos terminales: Representan a los tokens que se declararon en la secci´on
de reglas l´exicas del archivo FLEX, se debe tener en cuenta que aquellos terminales
que no tienen un valor son listados primero y los que tienen valor como el String
son listados en la segunda o dem´as l´ıneas. Ver Figura 8.
Figura 8: S´ımbolos terminales
S´ımbolos no terminales: Estos nodos son utilizados para especificar la parte
gramatical de nuestro compilador, al igual que en los nodos terminales, los nodos
que tienen un valor Object (no tienen un tipo de valor definido, cuyo valor puede
ser String, int, etc) son listados primero y los que tienen valor un String son listados
en la segunda o dem´as l´ıneas. Ver Figura 9.
Figura 9: S´ımbolos no terminales
4 . Definici´on S´ımbolos iniciales de la gram´atica
Esta secci´on permite especificar la gram´atica que tener nuestro analizador sint´actico,
el cual evaluar´a las entradas que se proporcionen a nuestro compilador y determinar´a si
las cadenas son aceptadas o no.
Declaraciones de precedencia: Primeramente se realiza las declaraciones de pre-
cedencia para nuestro compilador. En donde expr list permite que nuestro compi-
lador analice todas las entradas del archivo de texto, mientras que en expr part se
detalla c´odigo java para la presentaci´on de resultados obtenidos. Esto se aprecia en
la Figura 10.
Figura 10: Declaraciones de precedencia
11
12. Gram´atica: Por ´ultimo en esta parte se especifica la gram´atica que aceptar´a nuestro
compilador, as´ı como el c´odigo java que se ejecutar´a para obtener la salida deseada
de nuestro compilador (ver Figura 11). Es por ello, que el resultado obtenido luego
de validarse la gram´atica y ejecutarse el c´odigo java se debe asignar a RESULT,
el cual pasar´a dicho resultado al nodo no terminal expr part definido en la secci´on
anterior Declaraci´on de precedencia.
Figura 11: Gram´atica
Una vez que se a terminado de explicar cada una de las secciones que componen el
analizador sint´actico, se presenta finalmente en la Figura 12. la estructura del archivo
CUP de nuestro problema.
12
14. E. Ejecuci´on del Compilador
Para la presentaci´on de resultados se proceder´a a explicar el c´odigo JAVA necesario
para que nuestro compilador se ejecute de forma correcta y se detallar´a un ejemplo en en
cual se muestre los resultados al ingresar una cadena con la gram´atica correcta de forma
que sea aceptada por el compilador, as´ı como una cadena que contenga una gram´atica
incorrecta con lo cual el compilador presentar´a los errores que se producen y por que
raz´on esta cadena no es aceptada.
1 . C´odigo Java
Importaci´on de Librer´ıas: Para poder compilar nuestro caso de estudio debemos
tener importadas las librer´ıas la librer´ıa jcup a˜nadido al proyecto. Ver Figura 13.
Figura 13: Importaci´on de Librer´ıas
C´odigo para Ejecutar Compilador: En esta secci´on llamamos las librer´ıas jflex
y jcup que permitir´an crear las clases AnalizadorLexico.java, AnalizadorSintacti-
co.java, y sym que contienen la estructura de los archivos Flex y Cup creados para
el compilador, as´ı como los s´ımbolos o tokens. Ver Figura 14.
14
15. Figura 14: C´odigo para Ejecutar Compilador
2 . Ejecuci´on del compilador
Creamos un archivo de texto que contiene la gram´atica aceptada para nuestro com-
pilador. Ver Figura 15.
Figura 15: Archivo de texto - Gram´atica correcta
Ejecutamos el compilador y obtenemos el resultado que se presenta la la Figura 16.
15
16. Figura 16: Resultado de Compilador - Gram´atica correcta
Creamos un archivo de texto que contiene una gram´atica no aceptada para nuestro
compilador. Ver Figura 17.
Figura 17: Archivo de texto - Gram´atica incorrecta
Ejecutamos el compilador y obtenemos el resultado que se presenta la la Figura 18,
al ingresar una gram´atica incorrecta en nuestro archivo de texto.
Figura 18: Resultado de Compilador - Gram´atica correcta
3 . Referencia de C´odigo
El c´odigo de los archivos Flex y Cup los puede encontrar en el siguiente enlace: https:
//code.google.com/p/ejemplo-cup/source/browse/
16
17. F. Conclusiones y Recomendaciones
1 . Conclusiones
La elaboraci´on del aut´omata del problema a resolver, permite conocer como fun-
cionar´a el compilador y de esta forma se definir´a correctamente las expresiones
gramaticales.
En el archivo.flex se debe definir los tokens y los m´etodos para detecci´on de errores,
los cuales permiten al compilador funcionar de forma correcta.
A trav´es del archivo.cup se determina y eval´ua las expresiones gramaticales que
ser´an aceptadas por el compilador
La opci´on %cup que se define en el archivo flex permite activar la compatibilidad
entre el analizador l´exico y sint´actico, permitiendo as´ı trabajar con los tokens que
se especificaron en el aut´omata.
2 . Recomendaciones
Determinar correctamente el alfabeto que va aceptar el aut´omata, para as´ı definir
correctamente las expresiones gramaticales que formar´an parte del compilador a
desarrollar.
Personalizar los mensajes de error en el archivo.cup de forma que indique por que
raz´on se presenta un error en una cadena a validar, as´ı como la fila y columna en
que se encuentra para que el usuario pueda corregirlo f´acilmente.
17
18. G. BIBLIOGRAF´IA
Referencias
[1] Giaa. “Analizador L´exico”. Disponible en: http://www.giaa.inf.uc3m.es/
docencia/ITIG/lexico.pdf
[2] Ortega, J. “Tutorial Jlex y Java Cup”. Disponible en: https://www.scribd.com/
doc/78814502/Jlex-y-Cup2
[3] Slideshare. “Analizzador L´exico”. Disponible en: http://es.slideshare.net/
maryr_/actividad-2-analizador-lxico-sintctico-y-semntico
[4] Slideshare. “Compiladores e interpretes”. Disponible en: http://www.escet.urjc.
es/˜ci/material/lexico.pdf
[5] Trejo, M.(2004). “RELIPMOC: Construcci´on de un Compilador B´asico haciendo uso
de las herramientas JLex y CUP”. Disponible en: http://www.dynamics.unam.edu/
users/mtrejo/cursos/compiladores/compilers.pdf
[6] Universidad de Huelva. Departamento de Tecnolog´ıas de Informaci´on. “Procesado-
res de Lenguaje”. Disponible en:http://www.uhu.es/francisco.moreno/gii_pl/
docs/Tema_2.pdf
[7] Vega, R.(2008). “Integraci´on de JFlex y Cup. Analizadores L´exico y Sint´actico”.
Disponible en: http://www.rafaelvega.com/wp-content/uploads/Articulo.pdf
18