Analizador Léxico y Sintáctico Con Jflex y Cup para Un Compilador
Analizador Léxico y Sintáctico Con Jflex y Cup para Un Compilador
Analizador Léxico y Sintáctico Con Jflex y Cup para Un Compilador
UNIVERSIDAD
NACIONAL
DE LOJA
Area
de la Energa las Industrias y los Recursos Naturales No Renovables
COMPILADORES
Autor:
Chimbo-Torres, Richard-Daniel
Docente:
Paz-Arias, Henry-Patricio
Loja-Ecuador
2015
Indice
A. Tema
B. Definici
on del Problema
C. Compilador
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
B.
Definici
on del Problema
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.
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.
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.
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():
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.
11
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.
1.
Pruebas
F.
Bibliografa
G.
1.
Anexos
Anexo 1: Licencia
2.
15