練習 47:bc
譯者:飛龍
自豪地采用谷歌翻譯
你應該熱身并準備處理這個新項目。我通常假設,你將在一兩天內的 2~3 小時的會話中完成這些項目,但你通常可以盡可能多地實現這些項目。
這個項目是,使用第五部分學到的內容,來為bc
程序創建語言。我們已經在練習 36 中,為bc
實現了簡單的數學運算,但現在你將盡可能多地實現bc
語言。bc
大量運算符、函數和控制結構。你的目標是使用你對遞歸下降解析器的了解,來逐步實現它。
我將重點關注你的掃描器的構建,從掃描、解析、分析開始,并使用bc
的樣例代碼進行測試。這個項目可能是巨大的,因為你手動實現語言,但盡可能多地完成語法。
挑戰練習
bc
語言不僅僅擁有處理數學運算的能力。我從不僅僅使用基礎數學運算,完整的語言相當強大。你有能力定義函數,使用if
語句,并實現許多其他常見的編程結構。在實現中,你無法實現整個bc
語言,因為它太大了。相反,你應該實現這些東西:
- 所有的數學運算符
- 變量
- 函數
-
if
語句
這實際上是你應該實現該語言的順序。首先,讓運算符工作和解析良好。隨意借鑒你在練習 35 中創建的簡約實現,來起步。一旦實現了它,實現變量,這將需要使分析器正確處理變量的存儲和檢索。最后,你可以實現函數,然后是if
語句。
你需要鉆研 GNU 版本的bc
的任何文檔,因為它擁有語言的相當不錯的完整描述,以便你可以實現它。它沒有什么神奇的,因為他們大多從 C 復制一切,許多其他語言都類似于它。
當你處理這個挑戰時,你需要花時間和步驟。實現語言的美妙之處是,你實際上可以以邏輯上清晰的順序進行,從掃描到解析到分析,而不會在三個階段之間有大的反彈。
最后,請記住,你正在實現一個遞歸下降解析器,實際上只是計算機科學解析中的低級版本。如果你正在做正經的解析工作,那么請使用一個解析器生成器,而不是用手寫。用手編寫它們只是一個有趣的挑戰,并且是一種方法,來學習如何在邏輯上構建文本處理。
研究性學習
為了研究bc
語言,你應該從 gnu.org 抓取源代碼,并查找文件bc.y
,sbc.y
和scan.l
。這可能令人困惑,所以去研究一個名為lex
的工具,和一個名為yacc
的工具。