Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
UNIVERSIDAD
NACIONAL
DE LOJA
Area
de la Energa las Industrias y los Recursos Naturales No Renovables
Autores:
Jonathan Bladimir Arrobo Ajila
Loja-Ecuador
2015
Indice
A. Problema
B. Introducci
on
C. Aut
omata
.
.
.
.
.
.
4
4
4
4
8
8
8
.
.
.
.
13
14
14
14
15
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
F. Repositorio del c
odigo Fuente
18
G. BIBLIOGRAFIA
18
A.
Problema
Este problema fue creado debido a que no hay un compilador que acepte n
umeros
binarios y mucho menos realizar suma entre ellos sin convertir primero a decimales.
Por eso hemos credo conveniente realizar un compilador para los n
umeros binarios el
cual me va a permitir realizar lo siguiente.
Suma 2 o mas n
umeros binarios
1. El analizador lexico ignora los espacios juntando cada termino hasta que encuentre
un operador(+)
2. Para terminar la operaciones se debe poner ;
3. Se realiza la suma de los n
umeros binarios q se hayan ingresados
4. Se puede ingresar mas de una operacion
5. El resultado me da como numero decimal y binario
Ejemplo: 10001 + 0111;
Resultado= Decimal 24 Binario 11000
B.
Introducci
on
C.
Aut
omata
Figura 1: Automata
D.
1.
En esta seccion se realizara la primera fase de un compilador, es decir su analisis lexicografico, tambien denominado abreviadamente analisis lexico.
1 .1.
Librera
Area
de codigo, importaciones y paquete
%%
Area
de opciones y declaraciones
%%
Area
de reglas[2]
Area
de c
odigo, importaciones y paquete
En esta area se realiza todas las importaciones que sean necesarias para crear la clase
lexica y tambien el paquete de donde se va a encontrar la clase que se va a crear que se
muestra en la figura 2.
Figura 2: Area
de codigo, importaciones y paquete
La primera instruccion nos dice que vamos a generar la clase lexica en el paquete
suma binario, la primera importacion nos indica la Liberia cup para poder tener una
conexion con el analizador sintactico y por ultimo tenemos java.io.Reader que es importacion para que me lea archivos ya que el analizador sintactico recibe un archivo y lo
va evaluando.
Area
de opciones y declaraciones
Este area permite indicar a JFlex una serie de opciones para adaptar el fichero java
resultante y que sera el que implemente nuestro analizador lexicografico en Java.
Opciones
Todas ellas empiezan por el caracter % y no pueden estar precedidas por nada en la
lnea en que aparecen, las opciones que utilizamos en el archivo lexico son las que se
muestran en la figura 3.
Figura 4: Declaraciones
Declaramos nuestro lenguaje que se va a utilizar para poder realizar las reglas lexicas,
Salto en esta variable se declara un salto de lnea para cuando en analizador sintactico
encuentre un salto de lnea o retorno de carro no me detecte a ese caracter, Esto es para
6
Area
de reglas
Esta seccion contiene expresiones regulares y acciones, las acciones son codigo en Java
que se ejecutara cuando se encuentre una entrada valida para la expresion regular correspondiente el cual se muestra en la figura 5.
Figura 5: Area
de Reglas
El area de reglas es el area mas importante porque aqu voy a decir como va a llegar
los datos al archivo sintactico. YYINITIAL este es el estado inicial del analizador lexico,
Las expresiones regulares solo seran comparadas si se encuentra en ese estado inicial. Es
decir, cada vez que se encuentra una coincidencia el scanner vuelve al estado inicial, Por
lo cual se ignoran estados intermedios, cuando el analizador lexico encuentre ; va a
devolver el token FIN LINEA que sera la finalizacion de una instruccion, + este es
otro token para realizar la suma entre 2 n
umeros binarios o mas, Binario cuando en
analizador lexico encuentre valores binario no importa cuantos sean siempre y cuando
sean(1y 0) hasta encontrar un signo + o un fin de lnea(;) ignorando los todos los espacios
declarados en la variable Espacio entonces devuelve el token BINARIO con todos los
binarios encontrados, (.) si se analizo todo el archivo y no se encontro ninguna coincidencia
entonces se va al error esto es para datos que no los encuentre en las reglas lexicas entonces
se enva el error al analizador sintactico.
2.
2 .1.
Analizador sint
actico
Librera:
Cup es un generador de analizadores sintacticos LALR en Java el cual recibe de entrada un archivo con la estructura de la gramatica y su salida es un parser escrito en Java
listo para usarse.
Decid dividir el tutorial en varias secciones para hacer mas facil el aprendizaje de
estas herramientas.[2]
2 .2.
Imports
En esta seccion creo que no tengo que ampliar mucho desde que programamos Java
sabemos como son los imports de librerias. Al igual que en el archivo jflex aqu en el archivo
cup tambien se realiza como primer paso las importaciones se describe en la figura 6.
Figura 6: Imports.
Primero se pone el nombre del paquete donde se va a generar la clase que es suman binario, luego se encuentra importacion para trabajar en tiempo real y la importacion del FileReader para que lea archivos cuando se ingrese los datos a compilar.
C
odigo del Usuario para el Parser:
Como el codigo Java es generado por la herramienta es muy difcil modificar lo en el
archivo de salida. As que aqu podemos declarar metodos y variables que pensamos usar
en la clase resultante. Si se declaran variables o metodos p
ublicos en esta seccion estos
podran ser accedidos por otras clases. Los metodos para controlar errores se pueden ver
en la figura 7 que es codigo java.
entonces nos toca separar solo dejar el valor 2, una vez separado lo comparamos con la
clase sym a ver de cuales de los tokens me esta dando un error, finalmente imprimimos el
error as para todo el lenguaje como se muestra en la figura 9.
En la siguiente figura 10 llamamos al metodo report fatal error Cuando se encuentra un error de donde el sistema no puede recuperarse, se lanza un error fatal y se verifica
que tipo de error es llamando al metodo creado en la figura 9.
Modificamos el metodo main, este metodo me recibe como parametro el archivo con
los datos a compilar, creamos una variable de tipo Objeto, Luego creamos un objetos de
la clase sintactico (AnalizadorSintactico) y nos pide como parametro un archivo de tipo
File, luego ejecutamos llamando al metodo parse() y cuando se encuentra una excepcion
se imprime un mensaje Ocurrio un error esto se encuentra en la figura 11.
10
11
Las variables terminales son las mismas que nosotros hablamos en el analizador lexico
de las expresiones regulares ya que los terminales seran los tokens que se encuentren en
la clase sym, cada terminal de debe declarar con su tipo de dato o en el caso de no saber
que tipo de dato es se deja un espacio y solo se pone el nombre de la variable en nuestro
caso los terminales son FIN LINEA, SUMA y el terminal de tipo entero es BINARIO.
Los no terminales son las variables que voy a utilizar en la gramatica igual que en las
terminales las no terminales tambien hay q indicar el tipo de dato que es o si no se pone
un Object en caso de no saber que tipo es, los no terminales que son de tipo Object es
expr list, expr part y final mente el no terminal de tipo entero expr.
Gram
atica
En esta seccion del archivo es donde escribiremos nuestra gramatica. En esta seccion
se declara la gramatica que vamos a utilizar, Se describe en la figura 15.
12
E.
Luego de a ver creado el archivo lexico y sintactico tenemos que generar las clase java
tanto del sintactico como lexico.
13
1.
Generar clase L
exica
Una vez terminadas todas las areas dela analizador lexico ya lo podemos generar la
clase lexica esto se muestra en la figura 16.
Para ejecutar el archivo lexico lo primero que tenemos que hacer es declarar una variable de tipo String lexico y asignarle el nombre del archivo que descrito anteriormente
que sera alexico.flex, File file se declara una variable de tipo File y se le enva como parametro la variable que fue creada anteriormente con el nombre del archivo lexico,
jflex.Main.generate(file) esta lnea de codigo llama a la librera Jflex para generar la
clase lexica con el nombre de AnalizadorLexico.java.
2.
Las lneas descritas en la figura 17 son para ejecutar el archivo cup y se generen las
clases java para poder ya probar el compilador. La primera lnea es una palabra reservada
que indica que se va a trabajar con el archivo sintactico, La siguiente lnea es el nombre
de como se va a llamar la clase y por u
ltimo el archivo sintactico (archSintactico), luego
se llama a la librera cup y se le enva el arreglo asintactico para que se genera la clase
sintactica (AnalizadorSintactico.iava).
3.
Una vez ya creadas las 2 clase sintactica y lexica tenemos que mover estas clases al
paquete (suman binario) de nuestro proyecto ya que cuando se generar las clases estas
se generan en donde encuentra los archivos lexico y sintactico como se muestra en la figura
18.
14
El metodo moverArch recibe como parametro un string con el nombre del archivo
que se va a mover y devuelve un valor booleano dependiendo si se pudo mover el archivo
o no, se crea una instancia de la clase File le enviamos como parametro el nombre del
archivo, luego verificamos si el archivo existe y lo movemos al package suman binario
pero en caso de no encontrar el archivo me presentara un mensaje, finalmente devolvemos
un valor booleano si se ha podido o no mover el archivo.
4.
Ejecutar
15
Cuando se selecciona la opcion 2 me pide que ingrese una cadena para evaluarla
as como en la siguiente figura 21, Como la cadena esta bien me da el resultado deseado.
16
Si el error es cuando esta mal estructurado no cumple con el automata pero todos sus
caracteres estan en el lenguaje del automata da el error de la figura 23. La cadena no es
aceptada y muestra un mensaje con la lnea y columna que esta el caracter mal y que
caracter es el que no consta en el lenguaje.
El ultimo tipo de error que tenemos es cuando me falta un Fin de lnea(;) como se
muestra en la figura 24: La cadena no es aceptada y muestra un mensaje informando que
falta el fin de lnea(;)
17
F.
Repositorio del c
odigo Fuente
G.
BIBLIOGRAFIA
Referencias
[1] Gandhy. (s.f.). open (fecks());. Obtenido de https://openfecks.wordpress.com/
jlex-y-cup/plantilla-archivo-jlex/
[2] Microsystems, S. (21 de 06 de 2014). JFlex - El Scanner Generador rapido para Java.
Obtenido de http://www.jflex.de/
18