Material‎ > ‎

TP3

Introducción

SCEQL es un lenguaje de programación exótico y notable por su minimalismo extremo. El objetivo de este Trabajo Práctico es implementar un intérprete que permita ejecutar un progama escrito en SCEQL.

SCEQL

El lenguaje SCEQL consta de 7 comandos, listados abajo. Un programa SCEQL consiste en una secuencia de estos comandos, posiblemente intercalados con otros caracteres, que son ignorados. Los comandos se ejecutan en forma secuencial, con algunas excepciones. Hay un puntero de instrucción que comienza referenciando al primer comando; el comando al que hace referencia se ejecuta, y luego el puntero se mueve al siguiente comando en la secuencia. El programa termina cuando el puntero se mueve mas allá del último comando.

El programa ejecutado dispone de una cola de bytes (números enteros no negativos, entre 0 y 255). El programa puede manipular la cola según una serie de comandos que se detallan a continuación, con la única restricción de que la cola nunca puede estar vacía. Al comenzar el programa la cola contiene un solo byte en 0:

Comando Descripción
! encolar un 0
= desencolar un byte y encolarlo
- decrementar el byte que está al frente de la cola (sin moverlo de lugar)
_ incrementar el byte que está al frente de la cola (sin moverlo de lugar)
\ si el byte al frente es cero, "saltar" hasta el comando siguiente al / correspondiente
/ "saltar" hacia atrás, hasta el comando \ correspondiente
* desencolar el byte al frente, imprimirlo interpretado como un caracter ASCII, y luego encolarlo

Los comandos \ y / se combinan de la misma manera que se suelen combinar los paréntesis: cada \ se combina con exactamente un / y vice versa, el \ debe aparecer primero, y no debe haber ningún \ o / sin combinar entre los dos.

Notar que en la implementación interna, la cola debe aceptar al menos una operación adicional a las operaciones estándar (encolar, desencolar, ver_primero, esta_vacia), ya que las operaciones - y _ deben modificar el elemento que se encuentra al frente de la cola sin moverlo de lugar.

Además, notar que las operaciones - y _ deben mantener la condición de que el número esté entre 0 y 255. Al decrementar 0 debe quedar 255, y al incrementar 255 debe quedar 0.

Consigna

Implementar un intérprete de SCEQL en Python. Debe permitir ejecutar un programa cualquiera recibiendo por parámetro de línea de comandos el nombre del archivo que contiene el código SCEQL (por lo general, un archivo con extensión .sceql). Por ejemplo, para ejecutar el programa hello.sceql:

$ python sceql.py hello.sceql
Hello world!

Además debe permitir ejecutar el programa en modo debug con el parámetro -d:

$ python sceql.py hello.sceql -d

Al ejecutar en modo debug, el programa debe mostrar paso a paso el estado de la ejecución: el contenido de la cola y una representación del código con una indicación de la posición actual. Además debe esperar a que el usuario presione la tecla Enter entre cada comando.

La forma en que se imprima el estado en modo debug queda a libre elección, pero se espera que se muestre de alguna manera que permita entender fácilmente cómo funciona el programa SCEQL.

Ejemplos

A continuación se listan algunos programas SCEQL de ejemplo, que pueden servir para verificar que el intérprete funciona correctamente.

hello.sceql

Este programa simplemente imprime la cadena Hello world!.

________________________________________________________________________*
_____________________________*
_______*
*
___*
!=____________________________________________*
=------------*
________*
=--------*
=___*
=------*
=--------*
_*
!==__________*

99.sceql

Imprime la letra de la canción 99 bottles of beer.

"99 bottles of beer" song in Sceql.
Written by Keymaker.
Uses UNIX nl (dec 10) in output.

_________!=_________!!===_=!===\\-/==\-==_=_==/==\-===_==/=\____
____________________________________________*====\-//===________
________________________________________*====-------------------
-----------------------------======_____________________________
___*====________________________________________________________
__________*====_____________*====_____*====*====--------*====---
----*====\-/======_==\-==_=--==/==\-===_==/====\-=_=-===/=\-====
_=/=\\-/________________________________________________________
___________________________________________________________*====
\-//====________________________________*====___________________
____________________________________________________________*===
=---------*====\-/________________________________*====_________
_________________________________________________________*====__
_*====*====_____________*====\-/________________________________
*====___________________________________________________________
____________________*====-*====\-/______________________________
__*====_________________________________________________________
___________________________*====------------*====---*====\-/____
____________________________*====_______________________________
________________________________________________________*====---
-------------------*====___________*====*====\-/________________
____________________________*====------------*====\-/===\-==_=_=
=/==\-===_==/=\________________________________________________*
====\-//===________________________________________________*====
------------------------------------------------======__________
______________________*====_____________________________________
_____________________________*====_____________*====_____*====*=
===--------*====-------*====\-/======_==\-==_=--==/==\-===_==/==
==\-=_=-===/=\-====_=/=\\-/_____________________________________
________________________________________________________________
______________*====\-//====________________________________*====
________________________________________________________________
_______________*====---------*====\-/___________________________
_____*====______________________________________________________
____________*====___*====*====_____________*====\-/_____________
_________________________________*====\-/__________*====________
________________________________________________________________
__*====_____________*====__________*====------*====\-/__________
______________________*====_____________________________________
__________________________________________*====-*====---------*=
===\-/________________________________*====_____________________
_______________________________________________*====___________*
====________*====---------*====\-/______________________________
__*====_________________________________________________________
________*====_____________*====----------*====\-/_______________
_________________*====__________________________________________
______________________________________*====---------------*====_
_________________*====*====\-/________________________________*=
===_____________________________________________________________
____________*====___________*====\-/____________________________
____*====_______________________________________________________
__________*====_________________*====---*====______*====-------*
====----------*====\-/__________________________________________
__*====------------*====\-/====\-=_=_===/==\-===_==/=_===\\-/==-
==-=/==\-=\-==_=_==/===\-==_===/====\\-/===-=_________=/==/=====
_=\-==_=_==/==\-===_==/====\-=_=_===/=\-====_=/=\\-/=-=\-==_=_==
/==\-===_==/=\________________________________________________*=
===\-//===________________________________________________*====-
-----------------------------------------------==/=\____________
________________________________________________________________
_________________________________*====_*====\-/_________________
_______________*====____________________________________________
_________________________________*====__*====___*====-----------
--*====\-//===________________________________*====_____________
_____________________________________________________*====______
_______*====_____*====*====--------*====-------*====\-/======_==
\-==_=--==/==\-===_==/====\-=_=-===/=\-====_=/=\\-/_____________
________________________________________________________________
______________________________________*====\-//====_____________
___________________*====________________________________________
_______________________________________*====---------*====\-/___
_____________________________*====______________________________
____________________________________*====___*====*====__________
___*====\-/________________________________*====________________
_______________________________________________________________*
====-*====\-/________________________________*====______________
________________________________________________________________
______*====------------*====---*====\-/_________________________
_______*====____________________________________________________
___________________________________*====----------------------*=
===___________*====*====\-/_____________________________________
_________*====\-/__________*====*====\-/===\-==_=_==/==\-===_==/
====\-==_=_==/===\-==_===/====/

Otros ejemplos incluidos

  • quine.sceql: Un quine es un programa que imprime su propio código fuente.
  • factoriales.sceql: Calcula e imprime factoriales arbitrariamente grandes. Lentamente.
  • fib.sceql: Calcula e Imprime la secuencia de fibonacci. También se toma su tiempo.

Parámetros de la línea de comandos

Para leer los parámetros de la línea de comandos, recomendamos utilizar el módulo argparse de la siguiente manera:

import argparse

def main():
    parser = argparse.ArgumentParser(description='Interprete de codigo SCEQL')
    parser.add_argument('archivo', metavar='archivo', help='archivo con codigo a interpretar')
    parser.add_argument('-d', '--debug', action='store_true', help='modo debug')
    args = parser.parse_args()

    nombre_archivo = args.archivo
    modo_debug = args.debug

    ...

main()

Criterios de aprobación

A continuación se describen los criterios y lineamientos que deben respetarse en el desarrollo del trabajo.

Informe

El informe debe consistir en una descripción del diseño del programa.

Debe recordarse que la etapa de diseño es anterior a la implementación, por lo tanto debe describirse, utilizando texto y/o diagramas, cómo se va a estructurar el código para cumplir con las especificaciones de la consigna.

Algunas preguntas que deberían responderse:

  • A grandes rasgos, ¿cómo será el flujo del programa?
  • ¿Qué estructura(s) de datos se usan?

Código

Además de satisfacer las especificaciones de la consigna, el código entregado debe cumplir los siguientes requerimientos:

  • El código debe ser claro y legible.
  • El código debe estructurarse en funciones y, cuando corresponda, módulos. Las funciones deben definirse de la manera más genérica posible.
  • Todas las funciones deben estar adecuadamente documentadas, y donde sea necesario el código debe estar acompañado de comentarios.

Entrega

La entrega del trabajo consiste en:

  • El informe y código fuente impresos. Para el código fuente utilizar una tipografía monoespacio.
  • El informe en formato PDF.
  • Una versión digital de todos archivos .py de código, separados del informe. En el caso de ser más de un archivo, comprimidos en un .zip.

El informe impreso debe entregarse en clase. Los dos últimos (PDF y código fuente) deben enviarse utilizando el formulario de entregas ubicado en https://algoritmos1rw.appspot.com.

Este trabajo práctico se desarrolla en forma grupal. El plazo de entrega vence el viernes 17 de noviembre de 2017.

ċ
tp3-ejemplos.zip
(4k)
Diego Essaya,
27 oct. 2017 20:36
Comments