Implementa un evaluador para un subconjunto muy simple de Forth.
Forth es un lenguaje de programación basado en pila. Implementa un evaluador muy básico para un subconjunto pequeño de Forth.
Tu evaluador debe admitir las siguientes palabras:
+, -, *, / (aritmética de enteros)DUP, DROP, SWAP, OVER (manipulación de la pila)Tu evaluador también debe admitir la definición de nuevas palabras usando la sintaxis habitual: : word-name definition ;.
Para simplificar, el único tipo de dato que necesitas admitir son enteros con signo de al menos 16 bits.
Debes usar las siguientes reglas para la sintaxis: un número es una secuencia de uno o más dígitos (ASCII), y una palabra es una secuencia de una o más letras, dígitos, símbolos o signos de puntuación que no sea un número. (Es probable que Forth use reglas un poco diferentes, pero esto se acerca lo suficiente).
Las palabras no distinguen entre mayúsculas y minúsculas.
A veces es necesario tanto personalizar como raise excepciones en tu código. Cuando lo hagas, siempre debes incluir un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho con la depuración.
Las excepciones personalizadas se pueden crear mediante nuevas clases de excepción (consulta classes para más detalles) que normalmente son subclases de Exception.
En situaciones en las que sabes que el origen del error será derivado de cierto tipo de excepción, puedes elegir heredar de uno de los built in error types bajo la clase Exception. Al lanzar el error, igualmente debes incluir un mensaje significativo.
Este ejercicio en particular requiere que crees una excepción personalizada que se lance/«arroje» cuando la pila no esté lo suficientemente llena. Las pruebas solo pasarán si personalizas una excepción adecuada, lanzas esa excepción con raise e incluyes los mensajes de error adecuados.
# subclassing the Exception to create a StackUnderflowError
class StackUnderflowError(Exception):
"""Exception raised when Stack is not full.
message: explanation of the error.
"""
def __init__(self, message):
self.message = message
# raising a StackUnderflowError
raise StackUnderflowError("Insufficient number of items in stack")
Además, este ejercicio requiere que lances varias built-in exceptions con mensajes de error.
Para lanzar una built-in exception con un mensaje, escribe el mensaje como argumento del tipo exception:
# an example when division by zero is attempted.
raise ZeroDivisionError("divide by zero")
#an example when the operation is undefined.
raise ValueError("undefined operation")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.