El objetivo de este trabajo es construir un interprete de un lenguaje simple mediante la utilización de Java como lenguaje base y las herramientas Lex y Yacc correspondientes.
La finalidad del lenguaje a interpretar generar series de números a partir de sentencias que indican las reglas para la construcción de estas series.
Se debe contar con un entorno para el desarrollo de programas en Java y descargar e instalar las siguientes implementaciones de Lex y Yacc:
Arch:
sudo paru -S byacc byaccj jflex
Ubuntu:
sudo apt-get install byacc byacc-j jflex
Luego es necesario realizar un fork del repositorio y trabajar sobre los códigos iniciales aquí facilitados.
Antes de comenzar el desarrollo es necesario verificar el correcto funcionamiento del ambiente.
- Abrir una terminal en el directorio
interpreter
.
- Ejecutar el comando
make
. Esto generará y compilará los archivossrc/org/unp/plp/interprete/Lexer.java
,src/org/unp/plp/interprete/Parser.java
y los 4 archivos.class
en el directoriobin
- Ejecutar el interprete usando el comando
make run
. Este se ejecutará en modo interactivo recibiendo comandos, de momento sólo reconoce números enteros.
- Ejecutar
cmd
y dirigirse al directoriointerpreter
.
- Editar
make.bat
indicando la ruta donde fue descargadoJFlex
modificando la variableJFLEX_HOME
.
- Ejecutar el script
make.bat
. Esto generará y compilará los archivossrc/org/unp/plp/interprete/Lexer.java
,src/org/unp/plp/interprete/Parser.java
y los 4 archivos.class
en el directoriobin
. Finalmente ejecutará el interprete.
- Al ejecutar el interprete usando el comando
make.bat
este se ejecutará en modo interactivo recibiendo comandos, de momento sólo reconoce números enteros.
El Mundo Wumpus es una caverna conformada por cámaras conectadas por pasillos. Escondido en alguna parte de la caverna se encuentra el terrible Wumpus, una bestia que se come a cualquiera que se atreva a entrar a su cámara. El Wumpus puede ser eliminado con un disparo, pero el héroe dispuesto a enfrentarlo solo cuenta con una flecha. Algunas cámaras contienen pozos sin fondo que atraparı́an a cualquiera que vague por estas cámaras. La única caracterı́stica atenuante de este sombrı́o ambiente es la posibilidad de encontrar un montı́culo de oro.
La compañı́a desarrolladora de videojuegos Text Adventures Games Inc. nos ha contactado para solicitarnos la creación de un prototipo de lenguaje de programación y la implementación de su interprete para facilitarles el desarrollo de su nueva serie de juegos Mundo Wumpus.
A continuación se presentan los requerimientos y especificaciones que necesitan satisfacer.
La programación del Mundo Wumpus puede pensarse en dos etapas, la de definición del mundo y la de juego. La definición del mundo debe realizarse una única vez, pero sobre esa misma definición es necesario poder jugar múltiples veces.
Mundo Wumpus se juega sobre un entorno representado por una grilla donde cada casilla representa una cámara de la caverna.
Lo primero que se debe realizar en la etapa de definición es determinar el tamaño del mundo, con la sentencia:
world 4x5;
Indicando que el mundo está formado por 4 filas y 5 columnas.
Una vez definido el tamaño del mundo es necesario poblarlo con los elementos que lo conforman (pozos, oro y Wumpus), por lo que es necesario, en principio, una sentencia que permita hacer referencia a una celda particular. La notación para realizar esto es de la forma:
[2,3]
Hace referencia a la celda en la fila 2 y columna 3.
Para la definición del mundo se requieren dos sentencias para poner y sacar elementos, definidas como put y rem respectivamente, para ser utilizadas como sigue:
put gold in [5,5];
Pone oro en la casilla 5,5rem pit in [3,4];
Remueve el pozo de la casilla 3,4put wumpus in [6,1];
Pone al wumpus en la casilla 6,1put hero in [4,2];
Pone al heroe en la casilla 4,2
Se debe tener en cuenta que sólo está permitido un montı́culo de oro y un Wumpus en el mundo, por lo que la acción de poner debe sobreescribir la posición anterior si se intenta poner más de uno.
Debido a que puede haber muchos pozos en el mundo, y se espera programar algunos mundos muy grandes, es necesario una mecánica que permita poner más de un pozo a la vez, especificando alguna lógica para su emplazamiento, por ejemplo:
put pit in [?, ? : i == j];
Pone pozos por la diagonal donde la fila es igual a la columna.rem pit in [2, ? : j = 2N];
Remueve pozos en la fila 2 donde la columna sea par.put pit in [?, ? : i >j, i + j >= 3];
Pone pozos en las casillas cuya fila sea mayor a la columna y, además, la suma de la fila y columna sea mayor o igual a 3.
Cuando aparecen ?
en las filas y/o columnas, siempre se hará referencia a ellas con las variables i
y j
respectivamente.
Este método para hacer referencia a conjuntos de casillas debe soportar el conjunto de expresiones del siguiente cuadro.
Expresión | Notación | Significado | Ejemplos |
---|---|---|---|
Aritméticas | +, −, ∗, \ | suma, resta, multiplicación, división entera | i + 3 j ∗ 2 + 5 i + j / 4 |
Relaciones | ==, <, >, <=, >= | igual, menor, mayor, menor o igual, mayor o igual | i > 2 j <= 7 i + 3 == j |
Forma | k=aN+b k=aN-b |
k es de la forma aN+b, donde a y b pueden ser cualquier escalar o estar ausentes. | i = 2N → i = 0, 2, 4, 6, ... j = 3N − 1 → j = 0, 2, 5, 8, ... |
Cuando se utilizan expresiones, después de :
todas las expresiones separadas por ,
deben evaluarse como un AND lógico.
Estas son las sentencias necesarias para definir el ambiente, pero se debe tener en cuenta que no puede haber conflictos en las casillas, o sea, no puede haber dos elementos diferentes en la misma casilla, por lo que se deja a discreción de la implementación como responde el interprete a instrucciones conflictivas.
Finalmente, es necesario implementar una sentencia que permita ver como está formado el mundo.
print world;
Esta sentencia debe devolver a la salida estándar la información completa del mundo en formato csv de la siguiente forma:
world,5,5
wumpus,3,2
gold,5,4
hero,3,2
pit,2,3
pit,5,1
pit,4,2
...
Donde world
indica el tamaño del mundo, wumpus
la posición del Wumpus, gold
la posición del oro, hero
la posición del heroe y pit
la de cada pozo. El orden en que aparecen no es importante.