為 Forth 的一個非常簡單的子集實作評估器。
Forth 是一種以堆疊為基礎的程式語言。請為 Forth 的一小部分子集實作一個最基本的評估器。
你的評估器必須支援以下詞彙:
+、-、*、/(整數運算)DUP、DROP、SWAP、OVER(堆疊操作)你的評估器也必須支援以慣用語法定義新的詞彙:: word-name definition ;。
為了保持簡單,你只需要支援一種資料型態:至少 16 位元大小的有號整數。
你應該採用以下語法規則:數字是由一個或多個(ASCII)數字字元組成的序列,詞彙則是由一個或多個字母、數字、符號或標點符號組成、且本身不是數字的序列。 (Forth 的規則可能略有不同,但這樣已經夠接近了。)
詞彙不分大小寫。
有時候,你會需要在程式碼中同時自訂和raise例外。這麼做的時候,一定要附上有意義的錯誤訊息,指出錯誤的來源。這能讓程式碼更好讀,對除錯也有很大的幫助。
自訂例外可以透過建立新的例外類別來達成(詳見 classes),這些類別通常是 Exception 的子類別。
如果你知道錯誤來源會是某種例外型別的衍生,可以選擇繼承 Exception 類別底下的其中一種built in error types。拋出錯誤時,仍然要附上有意義的訊息。
這個練習要求你建立一個 自訂例外,在堆疊內容不足時拋出/「擲出」。只有在你自訂了適當的例外、raise這個例外,並附上適當的錯誤訊息時,測試才會通過。
# 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")
此外,這個練習還要求你拋出幾個帶有錯誤訊息的 built-in exceptions。
若要拋出帶有訊息的 built-in exception,請把訊息寫成 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")