Implementa um avaliador para um subconjunto muito simples de Forth.
Forth é uma linguagem de programação baseada em pilha. Implementa um avaliador muito básico para um pequeno subconjunto de Forth.
O teu avaliador tem de suportar as seguintes palavras:
+, -, *, / (aritmética de inteiros)DUP, DROP, SWAP, OVER (manipulação de pilha)O teu avaliador também tem de suportar a definição de novas palavras usando a sintaxe habitual: : word-name definition ;.
Para simplificar, o único tipo de dados que precisas de suportar é o dos inteiros com sinal de, pelo menos, 16 bits.
Deves usar as seguintes regras para a sintaxe: um número é uma sequência de um ou mais algarismos (ASCII), uma palavra é uma sequência de uma ou mais letras, algarismos, símbolos ou pontuação que não seja um número. (O Forth provavelmente usa regras ligeiramente diferentes, mas isto é suficientemente próximo.)
As palavras não distinguem maiúsculas de minúsculas.
Por vezes é necessário personalizar e lançar exceções no teu código. Quando o fazes, deves incluir sempre uma mensagem de erro significativa para indicar qual é a origem do erro. Isto torna o teu código mais legível e ajuda imenso na depuração.
As exceções personalizadas podem ser criadas através de novas classes de exceção (vê classes para mais detalhes.), que são normalmente subclasses de Exception.
Nas situações em que sabes que a origem do erro será derivada de um determinado tipo de exceção, podes optar por herdar de um dos built in error types sob a classe Exception. Quando lanças o erro, deves continuar a incluir uma mensagem significativa.
Este exercício em particular exige que cries uma exceção personalizada para ser lançada/"atirada" quando a pilha não estiver suficientemente preenchida. Os testes só passam se personalizares uma exceção adequada, lançares essa exceção com raise e incluíres as mensagens de erro adequadas.
# 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")
Além disso, este exercício exige que lances várias built-in exceptions com mensagens de erro.
Para lançar uma built-in exception com uma mensagem, escreve a mensagem como argumento do tipo de 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")
Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.