2010-04-15 55 views
8

在爲我的編程語言實現解釋器時,我首先想到了一個簡單的控制檯窗口,它允許用戶輸入一些代碼,然後將其作爲獨立程序作爲shell執行。Ruby和Python如何實現其交互式控制檯?

但存在嚴重的問題:如果用戶輸入的每行代碼都作爲獨立程序處理,則必須通過標記器和解析器,然後才由解釋器執行 - 那麼函數又如何呢?

  • Python/Ruby交互式控制檯(IDLE,irb)如何「共享」代碼?如何處理輸入的代碼?

例子:

>> def x: 
>> print("Blah") 
>> 
>> x() 

在哪裏存儲功能,因此它可以在任何時候再次叫什麼名字?

交互式控制檯怎麼能把所有輸入的東西當作一個程序而不需要一遍又一遍地執行?

回答

5

對於Python而言,直到所有圓括號,括號等相匹配,表達式纔會完成。這很容易檢測到。一個函數/類的定義在輸入一個完全空白的行之前是不完整的。編譯器然後編譯輸入的表達式或定義,並運行它。

與正常的函數,類,模塊等非常相似,REPL有其自己的本地範圍。這是用於輸入到REPL中的變量和定義的範圍。

3

您可以通過閱讀文檔的代碼模塊更多地瞭解Python交互式控制檯:

的代碼模塊,提供設施,以實現讀-EVAL-打印在Python循環。包括兩個類和便利功能,可用於構建提供交互式解釋器提示的應用程序。

http://docs.python.org/library/code.html

3

大多數語言的使用具有一種「令牌流」的分析器 - 也就是說,解析器會採取標記(字符串,符號,運營商等)從輸入直到它有一個完整的表達式,然後它返回解析後的表達式,它可能被編譯爲字節碼或以其他方式執行。由於解析器基本上要求更多輸入,因此REPL循環相對比較簡單,因此給出用戶提示並讓用戶輸入更多輸入。您可能需要從解析器到讀取器進行一些通信,使其呈現諸如繼續提示之類的內容。

Python和Ruby都立即按順序執行語句(函數聲明是一個語句)。因此,您可以在解釋器中逐句執行代碼,以達到與源文件基本相同的效果。

相關問題