# 練習 47:`bc`
> 原文:[Exercise 47: bc](https://learncodethehardway.org/more-python-book/ex47.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
你應該熱身并準備處理這個新項目。我通常假設,你將在一兩天內的 2~3 小時的會話中完成這些項目,但你通常可以盡可能多地實現這些項目。
這個項目是,使用第五部分學到的內容,來為`bc`程序創建語言。我們已經在練習 36 中,為`bc`實現了簡單的數學運算,但現在你將盡可能多地實現`bc`語言。`bc`大量運算符、函數和控制結構。你的目標是使用你對遞歸下降解析器的了解,來逐步實現它。
我將重點關注你的掃描器的構建,從掃描、解析、分析開始,并使用`bc`的樣例代碼進行測試。這個項目可能是巨大的,因為你手動實現語言,但盡可能多地完成語法。
## 挑戰練習
`bc`語言不僅僅擁有處理數學運算的能力。我從不僅僅使用基礎數學運算,完整的語言相當強大。你有能力定義函數,使用`if`語句,并實現許多其他常見的編程結構。在實現中,你無法實現整個`bc`語言,因為它太大了。相反,你應該實現這些東西:
+ 所有的數學運算符
+ 變量
+ 函數
+ `if`語句
這實際上是你應該實現該語言的順序。首先,讓運算符工作和解析良好。隨意借鑒你在練習 35 中創建的簡約實現,來起步。一旦實現了它,實現變量,這將需要使分析器正確處理變量的存儲和檢索。最后,你可以實現函數,然后是`if`語句。
你需要鉆研 GNU 版本的`bc`的任何文檔,因為它擁有語言的相當不錯的完整描述,以便你可以實現它。它沒有什么神奇的,因為他們大多從 C 復制一切,許多其他語言都類似于它。
當你處理這個挑戰時,你需要花時間和步驟。實現語言的美妙之處是,你實際上可以以邏輯上清晰的順序進行,從掃描到解析到分析,而不會在三個階段之間有大的反彈。
最后,請記住,你正在實現一個遞歸下降解析器,實際上只是計算機科學解析中的低級版本。如果你正在做正經的解析工作,那么請使用一個解析器生成器,而不是用手寫。用手編寫它們只是一個有趣的挑戰,并且是一種方法,來學習如何在邏輯上構建文本處理。
## 研究性學習
為了研究`bc`語言,你應該從 [gnu.org](http://ftp.gnu.org/gnu/bc/) 抓取源代碼,并查找文件`bc.y`,`sbc.y`和`scan.l`。這可能令人困惑,所以去研究一個名為`lex`的工具,和一個名為`yacc`的工具。
- 笨辦法學 Python · 續 中文版
- 引言
- 第一部分:預備知識
- 練習 0:起步
- 練習 1:流程
- 練習 2:創造力
- 練習 3:質量
- 第二部分:簡單的黑魔法
- 練習 4:處理命令行參數
- 練習 5:cat
- 練習 6:find
- 練習 7:grep
- 練習 8:cut
- 練習 9:sed
- 練習 10:sort
- 練習 11:uniq
- 練習 12:復習
- 第三部分:數據結構
- 練習 13:單鏈表
- 練習 14:雙鏈表
- 練習 15:棧和隊列
- 練習 16:冒泡、快速和歸并排序
- 練習 17:字典
- 練習 18:性能測量
- 練習 19:改善性能
- 練習 20:二叉搜索樹
- 練習 21:二分搜索
- 練習 22:后綴數組
- 練習 23:三叉搜索樹
- 練習 24:URL 快速路由
- 第四部分:進階項目
- 練習 25:xargs
- 練習 26:hexdump
- 練習 27:tr
- 練習 28:sh
- 練習 29:diff和patch
- 第五部分:文本解析
- 練習 30:有限狀態機
- 練習 31:正則表達式
- 練習 32:掃描器
- 練習 33:解析器
- 練習 34:分析器
- 練習 35:解釋器
- 練習 36:簡單的計算器
- 練習 37:小型 BASIC
- 第六部分:SQL 和對象關系映射
- 練習 38:SQL 簡介
- 練習 39:SQL 創建
- 練習 40:SQL 讀取
- 練習 41:SQL 更新
- 練習 42:SQL 刪除
- 練習 43:SQL 管理
- 練習 44:使用 Python 的數據庫 API
- 練習 45:創建 ORM
- 第七部分:大作業
- 練習 46:blog
- 練習 47:bc
- 練習 48:ed
- 練習 49:sed
- 練習 50:vi
- 練習 51:lessweb
- 練習 52:moreweb