# 练习 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