笨辦法學 Python · 續 練習 47:`bc`

練習 47:bc

原文:Exercise 47: bc

譯者:飛龍

協議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

你應該熱身并準備處理這個新項目。我通常假設,你將在一兩天內的 2~3 小時的會話中完成這些項目,但你通常可以盡可能多地實現這些項目。

這個項目是,使用第五部分學到的內容,來為bc程序創建語言。我們已經在練習 36 中,為bc實現了簡單的數學運算,但現在你將盡可能多地實現bc語言。bc大量運算符、函數和控制結構。你的目標是使用你對遞歸下降解析器的了解,來逐步實現它。

我將重點關注你的掃描器的構建,從掃描、解析、分析開始,并使用bc的樣例代碼進行測試。這個項目可能是巨大的,因為你手動實現語言,但盡可能多地完成語法。

挑戰練習

bc語言不僅僅擁有處理數學運算的能力。我從不僅僅使用基礎數學運算,完整的語言相當強大。你有能力定義函數,使用if語句,并實現許多其他常見的編程結構。在實現中,你無法實現整個bc語言,因為它太大了。相反,你應該實現這些東西:

  • 所有的數學運算符
  • 變量
  • 函數
  • if語句

這實際上是你應該實現該語言的順序。首先,讓運算符工作和解析良好。隨意借鑒你在練習 35 中創建的簡約實現,來起步。一旦實現了它,實現變量,這將需要使分析器正確處理變量的存儲和檢索。最后,你可以實現函數,然后是if語句。

你需要鉆研 GNU 版本的bc的任何文檔,因為它擁有語言的相當不錯的完整描述,以便你可以實現它。它沒有什么神奇的,因為他們大多從 C 復制一切,許多其他語言都類似于它。

當你處理這個挑戰時,你需要花時間和步驟。實現語言的美妙之處是,你實際上可以以邏輯上清晰的順序進行,從掃描到解析到分析,而不會在三個階段之間有大的反彈。

最后,請記住,你正在實現一個遞歸下降解析器,實際上只是計算機科學解析中的低級版本。如果你正在做正經的解析工作,那么請使用一個解析器生成器,而不是用手寫。用手編寫它們只是一個有趣的挑戰,并且是一種方法,來學習如何在邏輯上構建文本處理。

研究性學習

為了研究bc語言,你應該從 gnu.org 抓取源代碼,并查找文件bc.ysbc.yscan.l。這可能令人困惑,所以去研究一個名為lex的工具,和一個名為yacc的工具。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容