為 Forth 的一個非常簡單的子集實作評估器。
Forth 是一種以堆疊為基礎的程式語言。請為 Forth 的一小部分子集實作一個最基本的評估器。
你的評估器必須支援以下詞彙:
+、-、*、/(整數運算)DUP、DROP、SWAP、OVER(堆疊操作)你的評估器也必須支援以慣用語法定義新的詞彙:: word-name definition ;。
為了保持簡單,你只需要支援一種資料型態:至少 16 位元大小的有號整數。
你應該採用以下語法規則:數字是由一個或多個(ASCII)數字字元組成的序列,詞彙則是由一個或多個字母、數字、符號或標點符號組成、且本身不是數字的序列。 (Forth 的規則可能略有不同,但這樣已經夠接近了。)
詞彙不分大小寫。
在 Forth 裡,函式被稱為words,它們在資料堆疊上運作。
每個 word 會從堆疊取出參數,並把結果回傳到堆疊上。
Forth 的文件總是以( p1 p2 ... pN --- r1 r2 ... rN )這樣的形式,記載 word 執行前與執行後的資料堆疊狀態。
p1到pN代表呼叫前堆疊上的 word 參數(堆疊更上方可能還有這裡未列出的資料),而r1到rN代表呼叫後堆疊上的 word 回傳值。
分隔符---用來區分 word 執行前後的堆疊狀態。
要實作的 word 定義如下:
| word | 堆疊狀態 | 說明 |
|---|---|---|
+ |
( a b --- sum ) |
sum = a + b |
- |
( a b --- diff ) |
diff = a - b |
* |
( a b --- prod ) |
prod = a * b |
/ |
( a b --- quot ) |
quot = a / b |
dup |
( a --- a a ) |
duplicate the value on the ToS |
drop |
( a --- ) |
drop the value on the ToS |
swap |
( a b --- b a ) |
swap the two values on the ToS |
over |
( a b c --- a b c b ) |
copy the 2nd value to the ToS |
如果你想玩玩看線上的 Forth 翻譯員,或是想進一步了解要實作的這些 word,可以試試 Easy Forth (特別是 Adding Some Numbers、Defining Words 和 Stack Manipulation 這幾個部分)。