August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
下面首先编写expression(),它的文法规则如下:
由于这是我们第一次尝试将一组文法规则转换为代码,将会经历一些不成功的开始。这是学习一种新技术常见的过程,我们可以从中学到很多有用的东西。特别地,通过观察相似代码段表现出令人吃惊的不同行为,初学者可以学到很多。阅读代码是积累编程技巧的有效途径。
首先看一下Expression'+'Term规则,我们首先调用expression(),然后寻找+(和-),最后是调用term():
这个程序看起来不错。它几乎是文法的一个简单誊写,其结构确实非常简单:首先读入一个Expression,然后判断它后面是否跟着一个‘+’或者一个‘-’,如果确是这样,则再读取Term。
不幸的是,这里存在很大问题。怎样才能知道一个表达式的结尾在何处,以便于寻找一个‘+’或者一个‘-’呢?请记住:我们的程序从左到右读取输入,它不能预取符号来查看前面是否有‘+’运算符。事实上,这个expression()函数只能执行到第一行代码,因为expression()在一直不停地调用自己,这种情况称为无限递归(infinite recursion)。实际上递归调用还是会停止的,因为每次调用都会消耗一定内存空间,当计算机内存被耗光时,程序就会退出。“递归”的含义就是程序调用自身,并不是所有的递归都是无限的,递归是一种非常有用的程序设计技术(参见8.5.8节)。 ...
Read now
Unlock full access