Está en la página 1de 17

CIS-IXB-001

UNIVERSIDAD
NACIONAL
DE LOJA

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

Carrera de Ingeniera en Sistemas

Informe del Compilador.

Proyecto Final
COMPILADORES
Noveno B

Autores:
Israel Alejandro Lopez Tene

Docente: Ing. Henry-Paz,

Loja-Ecuador
2015

Indice
A. Problema

B. Aut
omata
1 . Automata de la parte Lexica . . . . . . . . . . . . . . . . . . . . . . . . . .

3
3

C. Desarrollo del Compilador


1 . Descripcion del Analizador Lexico . . . . . . . . . . . . . . . . . . . . . . .
2 . Descripcion del Analizador Sintactico . . . . . . . . . . . . . . . . . . . . .

3
3
7

D. RESULTADOS

12

E. ENLACES DE DESCARGA

16

F. BIBLIOGRAFIA

17

A.

Problema

El compilador hace las operaciones de suma, resta, multiplicacion, identificacion de


n
umeros y smbolos a letras (los cuales identifican solo las respuestas). Se debe cumplir
las operaciones de suma, resta multiplicacion. Se debe seguir un orden establecido como
(entero smbolo entero), y as sucesivamente pero obligatoriamente de debe terminar en
un numero entero para que pueda ejecutarse la operacion. Para indicar la terminacion de
cada lnea o fin de lnea se debe obligatoriamente poner el smbolo (;), que indica que es
fin de lnea. A continuacion se muestra en la figura 1 con un ejemplo:

Figura 1: Ejemplo

B.
1.

Aut
omata
Aut
omata de la parte L
exica

Nos ayuda a identificar las variables, fin de lnea, restringir nuestro lenguaje que vamos
a utilizar. Como se muestra en la figura 2.

Figura 2: Automata Lexico

C.

Desarrollo del Compilador

1.

Descripcion del Analizador L


exico

Un archivo de entrada Jlex, es un archivo plano con la siguiente estructura:


3

Codigo del usuario


Directivas Jlex
Reglas para las Expresiones Regulares
1.1. Codigo del Usuario
Es la parte del archivo de entrada donde se coloca el codigo java que deseamos usar
en la clase que sera generada, esto quiere decir que Jlex copiara directamente el codigo a
la clase generada, aqu deben ir los importes a otras libreras.
En la primera lnea de la figura 3 se escribe el nombre del paquete donde se va a guardar
la clase del analizador lexico. En la lnea dos de figura 3 se realizan la importacion de la
librera cup.runtime. En la lnea tres de la figura 3 se realizan la importacion de io.Reader
la cual nos sirve para leer archivos.

Figura 3: Importaciones
1.2. Directivas Jlex
En esta seccion iran las directivas, o especificaciones para que opere JLEX, para obtener la salida deseada. [1]
Procedemos a cambiar el nombre de la clase del analzador, le podemos poner cualquier
nombre, como se muesta en la figura 4.

Figura 4: Nombre de la clase del Analizador


Con el siguiente codigo procedemos a activar el contador de lneas, variable yyline.
Como se muesta en la figura 5.

Figura 5: Contador de Lineas


Con el siguiente codigo procedemos a activar el contador de columna, variable yycolumn. Como se muesta en la figura 6.

Figura 6: Contador de Columna


Con el siguiente codigo procedemos a activamos la compatibilidad con Java CUP para
Analizadores Sintacticos (parser). Como se muestra en la figura 7.

Figura 7: Compatibilidad con Java Cup


Con el siguiente codigo procedemos a controlar el salto de lnea que puede suceder.
Como se muesta en la figura 8.

Figura 8: Controlador de salto de lnea


Con el siguiente codigo controlamos el espacio en blanco que normalmente es ignorado.
Como se muesta en la figura 9.

Figura 9: Controlador de espacios en blanco


Con el siguiente codigo especificamos que tendremos un digito del 1 al 9 seguido de
0 o mas dgitos del 0 al 9. Garantizando as la escritura de cualquier n
umero. Como se
muestra en la figura 10.

Figura 10: Delaracion de Variable Entero


Con el primer metodo generamos un Symbol, el cual nos retorna un type, un yyline,
yycolumn que nos sirven para guardar el tipo de token encontrado. Con el segundo metodo
Generamos un Symbol para el tipo de token encontrado junto con su valor. Como se
muestra en la figura 11.

Figura 11: Metodos Symbol


1.3. Seccion de reglas Lexicas
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.
Con el siguiente codigo especificamos que es el estado inicial del analizador lexico al
ser escaneadas. 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. Como se muestra en la figura
12.

Figura 12: Inicio de acciones


Con el siguiente codigo especificamos que cada vez que se encuentre un token declarado
en la clase sym, se haga un return.

En la primera lnea de la figura 13 estamos declarondo ;la cual nos va a retornar


PUNTOCOMA. En la segunda lnea de la figura 13 estamos declarondo -la cual nos
retorna SUMANDO. En la tercera lnea de la figura 13 estamos declarondo la cual nos
retorna RESTANDO. En la cuarta lnea de la figura 13 estamos declarondo *la cual nos
retorna MULTIPLICANDO. En la quinta lnea de la figura 13 estamos declarondo (la
cual nos retorna PARENIZQ. En la sexta lnea de la figura 13 estamos declarondo )la
cual nos retorna PARENDER.

Figura 13: Tokens


Con el siguiente codigo controlamos que si se encuentra un entero, se imprime, se
regresa un token n
umero que representa un entero y el valor que se obtuvo de la cadena
yytext al convertirla a entero, yytext es el token encontrado. Como se muesta en la figura
14.

Figura 14: Valor Entero


Con el siguiente codigo controlamos si el token contenido en la entrada no coincide
con ninguna regla entonces se marca un token ilegal. Como se muesta en la figura 15.[1]

Figura 15: Token Ilegal

2.

Descripcion del Analizador Sint


actico

Basicamente tiene la siguiente estructura:


imports java
c
odigo del usuario para el parser
c
odigo del usuario para las acciones de la gram
atica
Declaraci
on de Variables para la gram
atica
Gram
atica
2.1 Importaciones java
Es la seccion donde se realiza las importaciones que tendra el proyecto.
7

En la lnea uno de la figura 15 se coloca el nombre paquete donde se va a guardar


nuestro proyecto. En la lnea dos de la figura 15 realizamos la importacion de la librera
cup.runtime. En la lnea tres de la figura 15 se realizan la importacion de FileReader que
nos sirve para leer archivos. Como se muesta en la figura 16.

Figura 16: Importaciones


3.2 Codigo de Usuario para el Parser
Codigo del parser, se copia ntegramente a la clase final. Agregamos el manejo de
errores. Es el area donde podemos ingresar codigo java. Como se muesta en la figura 17.

Figura 17: Area de codigo java


Nos da aviso del error encontrado, proporcionandonos la lnea y columna en donde se
dio el error, ayudandonos as a saber donde esta exactamente el error. Como se muesta
en la figura 18.

Figura 18: Error en la lnea y la columna


Cuando se encuentra un error de donde el sistema no puede recuperarse, se lanza un
error fatal. Se despliega el mensaje de error y se finaliza la ejecucion. Este metodo nos
recibe un String que el mensaje y un Object el cual nos trae la informacion. Como se
muestra en la figura 19.

Figura 19: Error Fatal


Realizamos un metodo main para garantizar la ejecucion del analizador lexico y
sintactico, ademas que se pase como parametro la tabla de smbolos correspondiente.
Como se muestra en la figura 20.

Figura 20: Metodo Main en el Analizador Sintactico


3.3. Declaracion de la Variables Terminales y no terminales
Procedemos a declarar las variables terminales (tokens obtenidos por el analizador lexico). Las variables terminales que declaramos aqui deben ser los mismos que se declaramos
en el analizador Lexico. Como se muestra en la figura 21.

Figura 21: Variables Terminales


Declaramos la variable no terminales las cuales son las que representan producciones.
Tenemos declarado un valor Object y un entero. Un Object se refiere a que no tienen tipo,
pudiendo ser entero o String, y el non Terminal Integer nos dice que son de tipo Integer.
Como se muestra en la figura 22.

Figura 22: Variables no Terminales


En la figura 23 tenemos la siguiente sintaxis exprlist es la raz de la gramatica. Una
exprlist puede ser una exprlist seguida de una exprpart, o puede ser una exprpart. Un
terminal o no terminal se define termino ::= termino1 termino2 ... terminoN.; donde
9

termino puede ser terminal o no terminal, solo se permite un smbolo a la izquierda. La


sirve para indicar que es una produccion u otra. Debemos pasar de smbolos no terminales
a smbolos terminales. Una gramatica que no termina en smbolos terminales se dice que
no reduce, y por lo tanto nunca se finaliza su procesado. .

Figura 23: Declaracion de Sintaxis


En la figura 24 nos dice que exprpart se compone de una expr seguida de PUNTOCOMA. Declarando expr:e en la variable e tenemos la respuesta, ahi procedemos a comparar
variable e con los n
umeros del dos al once para as poder obtener la trasformacion de los
n
umeros que son las respuestas a su significado a letras.

Figura 24: Declaracion de Respuestas


En la figura 25 nos dice que expr puede ser una expresion que inicia por numero entero
SUMANDO O RESTANDO expr, de esa forma se realiza una suma o resta. Tambien puede
ser un n
umero entero, con esto se devuelve el valor del entero. En RESULT se almacena
el valor de las acciones, y se pasa al siguiente nivel de la gramatica.

10

Figura 25: Expresiones SUMANDO y RESTANDO


En la figura 26 nos dice que expr puede ser una expresion que inicia por numero entero
MULTIPLICANDO expr, de esa forma se realiza una multiplicacion. Tambien puede ser
un n
umero entero, con esto se devuelve el valor del entero. En RESULT se almacena el
valor de las acciones, y se pasa al siguiente nivel de la gramatica.

Figura 26: Expresiones MULTIPLICANDO


En la figura 27 nos dice que expr puede ser una expresion que inicia por un parentesis isquierdo expr y luego cerrada por un parentesis derecho, de esa forma se realiza la
utilizacion de los parentesis. En RESULT se almacena el valor de las acciones.

11

Figura 27: Expresiones de los parentesis

D.

RESULTADOS

Se procede a ejecutar el compilador. Para la compilacion del proyecto ejecutamos la


clase Main que en nuestro caso se llama EjemploCup, es la cual contiene nuestros metodos
para que se realice la ejecucion. Como se muestra en la figura 28.

Figura 28: Imagen de Estructura del Proyecto


En la Figura 29 que nos pide que elijamos un valor ya sea 1 o 2, como valor 1 que se
realice la generacion de los archivos Jflex.java y cup.java y como valor 2 la ejecucion del
archivo test.txt

Figura 29: Consola de Ejecucion


En la figura 30 elegimos la opcion 1 la cual nos genera los archivos, nos muestra que
no tenemos ning
un error y se nos generan los archivos con exito.
12

Figura 30: Ejecucion de Archivos


En la figura 31 elegimos la opcion 2 la cual nos ejecuta el archivo test.txt.

Figura 31: Ejecucion de Archivos test.txt


Ahora procedemos a controlar los errores.
En la figura 32 nos muestra la pantalla de la consola y la del archivo test.txt. En la
pantalla de test.txt nos muestra los ejemplos para la ejecucion, como se podra observar en
la figura 32 en el archivo test.txt tenemos una lnea de codigo que se encuentra incompleta
13

sin el fin de lnea, en la consola nos sale que existe un error, que no se ha colocado el fin
de lnea.

Figura 32: Error de Fin de Lnea


En la figura 33 nos muestra la pantalla de la consola y la del archivo test.txt. En la
pantalla de test.txt nos muestra los ejemplos para la ejecucion, como se podra observar en
la figura 32 en el archivo test.txt tenemos una lnea de codigo que se encuentra erronea se
encuentra repetido el smbolo mas, en la consola nos sale que existe un error, que existe
smbolo repetido.

14

Figura 33: Error Simbolos Repetidos

15

E.

ENLACES DE DESCARGA

En el siguiente link se podra encontrar el codigo del proyecto:

https://github.com/israellpz1990/Compilador-Identificador-de-Simbolos-y-N-meros

16

F.

BIBLIOGRAFIA

Referencias
[1] Integracion JFlex Con CUP. 2012. (GRASIA). Disponible en: https://
openfecks.wordpress.com/jlex-y-cup/

17

También podría gustarte