2010-10-24 96 views
2

我需要用一種小型語言構建一個解釋器。它將解釋一個簡單的語言,只有很少的固定指令集,其中只有2種數據類型,它以後綴方式評估表達式。語言本身是逐行解釋的,解釋器會在遇到錯誤的指令集時拋出錯誤。在Smalltalk中構建一個解釋器

請幫助,如何開始與此口譯員。應該使用什麼樣的數據結構來從用戶輸入中提取數據並根據語言的指令集對其進行評估。

謝謝。

回答

2

這聽起來不太難實施。

後綴語言很容易使用堆棧實現。在Smalltalk中,堆棧可以是OrderedCollection,您可以在其上使用addLast:removeLast方法。

如果語言通過逐行解釋解釋程序的主循環可能看起來像:

instructions := sourceCode subStrings: (Character cr asString). 
instructions do: [:eachInstruction | ...] 

一種方法來構建代碼將創建一個Interpreter類具有堆棧成員變量和每種語言指令的方法。

這些指令的方法可以是這個樣子:

addInstruction 
| op1 op2 | 
op1 := stack removeLast. 
op2 := stack removeLast. 
stack addLast: (op1 + op2). 
+0

嗨,亞歷山大,因爲我是Smalltalk的新手,請幫助我更多地瞭解這一點。我需要使用簡單語言的兩種數據類型,我必須解釋Integer和一個鏈表。如果不需要,我是否需要實現鏈表?如何才能使用現有鏈表?我一直在研究Cincom的Visual Works 7.7。由於我需要製作它的GUI版本,我應該使用哪種數據結構來接受用戶的輸入,然後對鏈接列表對象執行語法檢查和各種操作。感謝上面提供的指針。 – max 2010-10-26 02:13:46

+0

@max您可以使用現有的LinkedList類來表示您的語言數據類型或作爲替代堆棧實現。我建議你選擇一本Smalltalk書籍並閱讀集合以瞭解如何使用LinkedList,OrderedCollection和其他集合類。 – 2010-10-26 13:34:20

+0

@max我不確定你想要構建什麼樣的GUI,但是我想到你的*逐行解釋器*可能是一個交互式解釋器。在VisualWork中獲取用戶輸入的一種簡單方法是調用「對話請求:」。正如其名稱所示,「對話請求:」顯示一個對話框,要求用戶輸入一行文本。一個簡單的交互式解釋器可以在一個循環中調用這個方法。 – 2010-10-26 14:32:31

0

解釋語言本身,您應該使用單獨的解析器,以確保表達以及形成之前。 PetitParser可能對此有用。