1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-31 05:27:43 +00:00
lmpythw-zh/ex47.md
wizardforcel 0b3524f3b1 ex47
2017-08-16 11:13:50 +08:00

37 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 练习 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`的工具。