August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
到现在为止,我们已经对程序进行了很好的改进,但很遗憾,它还不能正常运行。这并不意外,我们对程序下的“第一刀”通常是不会正常工作的,因为我们甚至还没有完成程序——程序还无法通过编译。程序还不能识别单词'=',但这可以通过在Token_stream::get()中添加一种情况处理来简单实现。但是对于单词let和name,必须修改get()函数来识别这些单词。一种实现如下:
首先请注意函数调用isalpha(ch),它用来检测输入ch是否为字符。isalpha()是一个标准库函数,可通过包含头文件std_lib_facilities.h来使用。更多的字符分类函数的内容可以参考11.6节。识别变量名与识别数字的方法是相同的:找到一个正确类别的字符(这里是一个字母)以后,使用putback()函数把它退回,然后使用>>读取整个变量名。
不幸的是,程序还是不能通过编译,因为Token无法存储一个字符串,编译器不能识别Token{name,s}。不过,修改Token的定义可以解决这个问题,必须使Token可以存储一个string或者double,并支持三种不同的初始化方法,即
·只有kind,例如Token{'*'}。
·一个kind和一个数,例如Token{number,4.321}。
·一个kind和一个name,例如Token{name,''pi''}。
为此,引入三个初始化函数,由于它们是用于构造对象的,所以我们称之为构造函数:
构造函数可使初始化过程更灵活,也易于控制。关于构造函数的细节将在第9章(9.4.2节和9.7节)中展开。 ...