2010-04-09 30 views
2

我已經在C++中構建了一個解釋器,目前爲止一切正常,但現在我陷入了import/include /的設計,但是您想調用它的功能。口譯員:處理包括/進口

我考慮以下內容:

  • 處理在標記化過程包括:當在所述代碼中發現的include,標記化函數遞歸調用與指定的文件名。然後將included文件的標記化代碼添加到包含的先前位置。 缺點:沒有條件包括(!)

  • 處理包括在解釋過程中:我不知道如何。我所知道的是,PHP must這樣做是因爲條件包含是可能的。

現在我的問題:

  • 我應該怎麼辦包括?
  • 現代解釋器(Python/Ruby)如何處理這個問題?他們允許有條件的包括嗎?
+0

*「缺點:沒有條件包括(!)「*我不知道這個條件是否成立,取決於你用於解析代碼的抽象表示的性質。 – dmckee 2010-04-09 16:43:31

回答

3

這個問題很容易解決,如果你有一個乾淨的設計,你知道你在做什麼。否則,它可能非常困難。我寫了至少6個口譯員都有這個功能,而且相當簡單。

  1. 你解釋需要保持一個環境它知道所有的全局變量,函數,類型等已定義的。你可能會覺得這更像一個「符號表」。

  2. 您需要定義一個讀取文件並更新環境的內部函數。根據您的語言設計,您在閱讀內容時可能會進行評估,也可能不會進行評估。我的翻譯非常具有動態性,只要讀入內容即可評估每個定義。

  3. 如果您的生活將會無限容易你組織你的解釋器層:

    • 標記生成器(符輸入令牌)
    • 分析器(一次讀取一個令牌,轉換爲抽象語法樹)
    • 評估程序(讀取抽象語法和更新環境)

抽象語法樹確實是關鍵。如果你有這個問題,當你在輸入中遇到import/include構造時,你只需進行遞歸調用並獲取更多抽象語法。您可以在解析器或評估器中執行此操作。如果您想要條件導入,您必須在評估程序中執行此操作,因爲只有評估人員可以計算條件。

Source code for my interpreters在網頁上。其中兩個用C寫成;其他的都是用標準ML寫的。

+0

你打算把講義重新放在網上嗎?我讀了其他地方的東西這本書應該是幾年前纔出版的,這是怎麼回事? – 2010-04-10 14:51:14

+0

@Wei:我換了一些工作,這本書已經讓這本書早了幾年,目前我正在重寫一些軟件,並且正在開發一個新的第8章的版本以及第7章的額外材料。我將在明年春天再次教PL,並希望向他們周圍的發佈者發送草稿。 – 2010-04-10 18:37:41

+0

謝謝!是否可以閱讀您的草稿,還是僅適用於有限的課程導師? – 2010-04-10 22:25:01