Analizador Léxico y Sintáctico Con Jflex y Cup para Un Compilador

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 15

TFC-CIS-IXB-004

UNIVERSIDAD
NACIONAL
DE LOJA

Area
de la Energa las Industrias y los Recursos Naturales No Renovables

Carrera de Ingeniera en Sistemas

COMPILADORES

Compilador para transformar unidades de


peso: kilogramo-libra-onza
Noveno B

Autor:
Chimbo-Torres, Richard-Daniel

Docente:
Paz-Arias, Henry-Patricio

Loja-Ecuador
2015

Indice
A. Tema

B. Definici
on del Problema

C. Compilador

D. Fases del Compilador


1 . Analisis Lexico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 . Archivo Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 . Analisis Sintactico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5
5
6
8

E. Ejecuci
on
13
1 . Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
F. Bibliografa

15

G. Anexos
15
1 . Anexo 1: Licencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2 . Anexo 2: Figura del Automata . . . . . . . . . . . . . . . . . . . . . . . . . 15

Indice de figuras
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

Importaciones . . . . . . . . . . . .
Metodo symbol . . . . . . . . . . .
Expresiones Regulares . . . . . . .
Reglas Lexicas . . . . . . . . . . . .
Importaciones y paquetes . . . . . .
Metodo report error() . . . . . . .
Error por falta de FINDELINEA .
Teminos terminales y no terminales
Declaracion de gramatica Kg a Lb .
Declaracion de gramatica Kg a Onz
Declaracion de gramatica Lb a Kg .
Declaracion de gramatica Lb a Onz
Declaracion de gramatica Onz a Kg
Declaracion de gramatica Onz a Lb
Metodo de Realizacion de Pruebas
Archivo de entrada . . . . . . . . .
Resultados de la Ejecucion . . . . .
Licencia . . . . . . . . . . . . . . .
Fig. Automata . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

6
7
7
8
8
9
9
11
11
11
12
12
12
12
13
14
14
15
15

A.

Tema

Compilador para transformar


unidades de peso: kilogramo,
libra,onza

B.

Definici
on del Problema

En el noveno modulo de la Carrera de Ingeniera en Sistemas se abarcan materias


muy significativas en la formacion academica y profesional de los estudiantes, una de
esas materias es la de Compiladores, pues la importancia de su estudio radica en que,
sin estos programas no existira ninguna aplicacion informatica, ya que son la base de la
programacion en cualquier plataforma.
Tomando como antecedente lo anterior mencionado se planteo desarrollar un proyecto en
el cual aplicaramos conceptos y tecnicas para construir un compilador que resuelva un
problema especfico, que para este caso fue el de realizar un analizador lexico y sintactico
para un compilador que haga transformaciones entre unidades de peso como kilogramo,
libra y onza.
Se opto por resolver este problema debido a que se quera hacer una conversion rapida
entre medidas, pues si bien la medida que se ha estandarizado internacionalmente es el
Kilogramo, en sectores como el nuestro a
un resulta com
un escuchar en mercados, plazas
y hasta en supermercados que se manejan medidas como libras y onzas y si un visitante
extranjero desea comprar algo habra desentendimiento en ambas partes, entre el vendedor
y comprador por la equivalencia de la medida solicitada, dandose el mismo caso si el
extranjero fueramos nosotros.
Ademas porque para las reglas lexicas era necesario definir tanto alfabetos para letras y
n
umeros a traves de las expresiones regulares, lo que le va dando una mayor dimension al
programa, otra razon que motivo el plantear este trabajo fue el de dar a quienes estudien
posteriormente esta materia, una gua o marco de referencia a tener en cuenta para la
realizacion de sus futuros proyectos.

C.

Compilador

Para la elaboracion del proyecto se hizo uso de las libreriass JFlex y CUP proporcionadas por Java para hacer el analisis lexico y sintactico respectivamente del compilador
propuesto, para el desarrollo se uso el IDE Netbeans y el editor de texto que soporta
sintaxis Brackets.

D.
1.

Fases del Compilador


An
alisis L
exico

Para realizar el analisis lexico fue necesario definir los elementos que se van a utilizar
para el desarrollo del problema, los elementos fueron los siguientes:
1. Variable:
Valor a convertir
2. Operador:
5

Convertir
3. Palabras Reservadas
Kilogramo
Libra
Onza
4. Fin de Lnea
FINLINEA

2.

Archivo Flex

Una vez identificados los elementos que se necesitara para construir el archivo Flex,
se procede a realizar la primera fase del compilador. El archivo Flex debe tener una
extension .flex y en el se colocara las expresiones regulares y las reglas lexicas necesarias
para que sean reconocidos los componentes o elementos expuestos en el parrafo anterior.
A continuacion se analizara el archivo .flex del proyecto, cabe se
nalar que este archivo se
encuentra dividido en 3 secciones, de las cuales doy detalle a continuacion.
1. Importaci
on de paquetes En esta seccion se deben hacer las importaciones a los
paquetes que se va a necesitar. En la imagen siguiente se puede ver el nombre del
paquete en el que se encuentra el archivo flex, ademas se ha importado los paquetes
de la herramienta CUP para activar la compatibilidad del analizador lexico con la
herramienta CUP, con la cual se construye el analizador sintactico del cual se hara
uso despues.

Figura 1: Importaciones
2. Opciones y declaraciones En esta seccion se construyen las expresiones regulares
que seran utilizadas para definir las reglas lexicas. Pero antes de eso se debe activar
una serie de sentencias que me van a permitir otorgarle nuevas funcionalidades al
compilador las cuales son descritas a continuacion:
%class Lexer: Aqu se establece el nombre que tendra la clase .java que implementa el analizador lexico, que para este caso sera class Lexer generandome
la clase Lexer.java
%line: Activa el contador de lneas.
%column: Activa el contador de columnas.
%cup: Activa la compatibilidad con la librera CUP, esto servira para la construccion del analizador sintactico.
6

Activado esto, lo siguiente que vamos a encontrar en el archivo .Lex son los metodo
symbol que retornan un objeto tipo Symbol que es usado por la herramienta CUP
para determinar los tokens encontrados, para su mejor comprension ver la siguiente
imagen.

Figura 2: Metodo symbol


Finalmente se llega a la parte en donde se definen las expresiones regulares para el
compilador, que para este problema en particular son las siguientes:
A=[a-zA-Z]: Establece el alfabeto que sera usado, en este caso consta de todo
el abecedario en may
usculas y min
usculas.
N=[0-9]+[0-9]*: Establece los valores numericos que seran usados, en este caso
estara en un rango de 0 a 9.
WHITE=[ t-n-r]: Determina el conjunto de espacios en blanco constituido por
un espacio en blanco, tabulacion, salto de lnea y retorno de carro.

Figura 3: Expresiones Regulares


3. Reglas L
exicas
En la siguiente figura se puede apreciar las reglas lexicas usadas en el proyecto, se
va a ir explicando regla por regla en donde:
((YYINITIAL)) Marca el estado inicial del analisis.
{WHITE} /*Ignore*/ Se usa la declaracion anteriormente realizada y se da la
orden de ignorar cualquier elemento perteneciente a la misma.
C
onvertiro convertirreturn symbol(sym.OPERADOR);: Esta regla indica que
si es ingresado las palabras Convertir o convertir, el token correspondera a un
Operador.
{N} return symbol(sym.VARIABLE, new Double(yytext())); : Se hace uso de
la declaracion de la seccion anterior, aqu definiremos la varible con la que se
va a trabajar
7

{FINLINEA} return symbol(sym.FINLINEA);: Se hace uso de la declaracion


de la seccion anterior, aqu se define la varible que servira para determinar que
se ha llegado al final de la sentencia.
Kilogramokgkilogramoreturn symbol(sym.KILOGRAMO);
Libralblibrareturn symbol(sym.LIBRA);
.Onza.onz.onzareturn symbol(sym.ONZA);
Estas tres declaraciones indican el token que se devolvera de acuerdo a las
medidas ingresadas.
[.] throw new Error(.A ingresado un caracter ilegal ==-yytext()+))-linea
-yyline+C
olumna -yycolumn); En esta seccion se indica al analizador que marque error en caso de encontrar un smbolo que no se haya declarado.

Figura 4: Reglas Lexicas

3.

An
alisis Sint
actico

Para realizar el analisis sintactico se hizo uso de la librera CUP proporcionada por
java para realizar el analisis antes dicho, la misma que trabaja con un archivo .cup.
El archivo .cup esta compuesto de las siguientes partes:
a) Importaciones y paquetes En esta seccion se hacen las importaciones a los
paquetes que vamos a necesitar. En la imagen siguiente se puede ver el nombre
del paquete en el que se encuentra el archivo cup.

Figura 5: Importaciones y paquetes

b) C
odigo de usuario del parser
En la siguiente imagen se muestra los metodos de reporte de errores. Este codigo debe ir entre los smbolos {: codigo:}, aqu se declaran variables y metodos
que seran usados en la clase java resultante. Se aprovecho esta seccion para
hacer la deteccion de errores, dandole una funcionalidad extra al compilador.
El metodo report error():

Figura 6: Metodo report error()


Primero se crea un objeto de tipo StringBuffer y se lo inicia con el valor de
Error que posteriormente sera concatenado a un objto tipo message para dar
los avisos de errores y abajo se esta instanciando un objeto de typo Symbol al
cual lo nombramos s, se hace esto con la finalidad de poder trabajar con los
tokens.
Error por falta de fin de Lnea: En este primer if se indica que aparecera
un error al momento de analizar la sentencia y fijarse al final de la misma
que falta el FINDELINEA, como se puede ver en la siguiente imagen.
Resulta conveniente primero indicar que la sentencia debe seguir la siguiente estrucutura: VARIABLE KILOGRAMO OPERADOR LIBRA
177 Kilogramo convertir libra

Figura 7: Error por falta de FINDELINEA


En la primera sentencia se indica que si el objeto s de tipo symbol que
creamos en la seccion anterior es igual al token 7 (en este ejercicio corresponde al valor de la VARIABLE) o es igual al token 0 (Fin de archivo)
entra a un nuevo if en el que vuelvo a preguntar si el token recibido es
igual a 7 si lo es ingresa a un nuevo if en el cual comparo si el objeto s.left
es mayor o igual a cero al objeto m de tipo StringBuffer le concadeno la
cadena En lnea seguido de la lneaen donde se encontro que se encontro
incompleta la sentencia, lo mismo hago para determinarla columna y al
9

final me retornara un mensaje indicandome el tipo de error y la lnea y


columna donde se lo ha encontrado.
Error Ingrese medida a la que desea transformar: Se informara de este
error al momento de ingresar la cantidad que deseo trasformar,y donde no
indico la unidad a la que deseo hacer la conversion.
A este metodo se lo explicara paso a paso:
if (s.left != 0) {
m.append(linea -((s.left+1)));
}
Estas lneas de codigo sirven para saber en que lnea se presenta el error,
en donde pregunta si a la izquierda del token hay algo me a
nada al mensaje
el error en la posicion encontrada.
if (s.right != 0) {
m.append(linea -((s.right+1)));
}
Hago lo mismo que en el paso anterior, pero esta vez es para encontrar
la columna en donde incide el Error, esto me sera de ayuda para identificar la ubicacion de todos los errores que se controle.
if (s.sym == 6) {

message=Error
Ingrese unidad a la que desea transformar;
}
Aqu se pregunta si el token hallado es igual a 6 que corresponde al token
de FINDELINEA me va a dar la alerta de que no se ha ingresado la unidad
a la que se desea tranformar.
Error Falta el Operador: Este error ocurre cuando se ha ingresado la cantidad a convertir, la unidad a la que va a ser convertida, pero no se ha
especificado en la sentencia el Operador:
if (s.sym == 4) {
message=Falta el operador;
}
Error Ingrese el n
umero o valor a convertir : Como su nombre lo indica
este error se da al momento de no especificar la cantidad que deseo que
sea transformada.
if (s.sym == 3 o s.sym == 5) {
message= Ingrese el n
umero o valor a convertir;
}
10

c) Declaraci
on de t
erminos Terminales y No terminales
Siguiendo con el analisis del archivo CUP se observa los terminos terminales y
no terminales usados en el analizador. Los terminos terminales los constituyen
los tokens anteriormente declarados en el archivo .flex, es importante que los
nombres esten escritos de la misma forma en ambos archivos.
Los terminos no terminales son declarados de acuerdo a las gramaticas que
posteriormente sean declaradas.

Figura 8: Teminos terminales y no terminales


d) Declaraci
on de gram
aticas
Las gramaticas son indispensables para a armar las expresiones que seran aceptadas en el compilador. A continuacion se muestran las gramaticas conforme a
las declaraciones aceptadas para cada tipo de conversion que se realiza.
En esta primera gramatica se indica la conversion de kilogramos a libras, esta
es la forma que tendra la sentencia para realizar esa conversion de acuerdo a
la forma que el analizador sintactico aceptara.

Figura 9: Declaracion de gramatica Kg a Lb


Esta segunda gramatica indica la conversion de kilogramos a onzas y como
debe de ser su estructura

Figura 10: Declaracion de gramatica Kg a Onz

11

La tercera gramatica permitira que se haga la conversion de Libras a kilogramos


y esta es su estructura.

Figura 11: Declaracion de gramatica Lb a Kg


La cuarta gramatica me permite que se haga la conversion entre Libras a onzas
sea posible y esta es su estructura.

Figura 12: Declaracion de gramatica Lb a Onz


Como quinta gramatica tenemos a la que nos permite realizar la conversion de
Onzas a kilogramos y esta es su estructura.

Figura 13: Declaracion de gramatica Onz a Kg


Finalmente esta sexta gramatica me indicara la estructura para la conversion
de Onzas a libras.

Figura 14: Declaracion de gramatica Onz a Lb

12

E.

Ejecuci
on

Para la ejecucion del compilador una vez se hayan elaborado los archivos .lex y
.cup sin errores, se ejecutara la clase Main del proyecto realizado en java. Una
vez aqu se generaran las clases .java que implementan a cada analizador. Las
siguientes lneas:
jflex.Main.main(alexico);
java cup.Main.main(asintactico);
Son las llamadas a los paquetes Flex y CUP para la generacion de sus clases.
El siguiente metodo sirve para la realizar las pruebas, en el se hace la lectura
de un archivo de texto y se enva esta lectura como parametro al metodo main
del analizador sintactico.

Figura 15: Metodo de Realizacion de Pruebas

1.

Pruebas

Para la ejecucion del compilador se debe tener un archivo de texto de donde


va a leer la sentencia ingresada y hacerle los respectivos analisis.
Las sentencias deben tener la siguiente estructura:
VARIABLE RESERVADO OPERADOR RESERVADO FINLINEA
Ejemplos:
17 Kilogramo convertir a libra
17 kg convertir a lb
En caso de que las sentencias contenidas en el archivo de texto presenten errores
en su estructura, el compilador indicara el tipo de error que se ha encontrado
y la fila y columna donde se ha producido.
Ejemplo:
17 kilogramo convertir
Error No existe la unidad a la que se desea transformar
Onza convertir libra
Error no existe el n
umero o cantidad a transformar
Ahora se mostrara el archivo de texto con las sentencias a evaluar el compilador:
13

Figura 16: Archivo de entrada


Al poner el proyecto a ejecutar se presentara un peque
no men
u con 3 opciones:
La primera opcion genera las clases en Java que implementan cada analizador.
La segunda opcion realiza las pruebas usando para ello el archivo de texto de
entrada.
La tercera opcion culmina con la ejecucion.
Como ya se han generado las clases previamente se procedera a ejecutar la
opcion 2 que va a validar la sentencia del archivo fichero1.txt cuyo resultado
se lo puede ver en la imagen siguiente:

Figura 17: Resultados de la Ejecucion


El primer resultado corresponde a la evaluacion de la sentencia:
98 kilogramo convertir libra
Cuyo resultado a la hora de convertir es: Respuesta es : 215.60000000000002
El segundo resultado corresponde a la evaluacion de la sentencia:
54 onza convertir kilogramo
Dando como resultado: 1.5308725973805068
Al final de la ejecucion se puede ver que se presenta un Error linea 3, columna 14 : Falta el operador y se puede ver que los metodos de deteccion de
errores funcionan.
Puede visualizar el proyecto en la siguiente direccion: https://code.google.
com/p/analizador-lexico-y-sintactico-con-cup-y-jflex/source/browse/
#svn%2Ftrunk%2FAL_RichardChimbo
14

F.

Bibliografa

1) Aguilera, M. Analisis Sintactico.[En linea] Disponible en: http://www.


lcc.uma.es/galvez/ftp/tci/tictema3.pdf
2) Aguilera, M. .Analisis Sintactico.[En linea] Disponible en: http://www.
lcc.uma.es/galvez/ftp/tci/tictema3.pdf
3) Textos Docentes. Desarrollo de compiladores. [En lnea]. Disponible en:
http://megazar.tripod.com/compil.pdf
4) Universitat Jaume. Procesadores de Lenguaje[En lnea] Disponible en:
ocw.uji.es/material/5184/raw

G.
1.

Anexos
Anexo 1: Licencia

Figura 18: Licencia

2.

Anexo 2: Figura del Aut


omata

Figura 19: Fig. Automata

15

También podría gustarte