August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
所有的读入操作都是get()函数完成的,如果在Token_stream::buffer中没有单词,get()函数必须从cin读入字符并将它们组成单词。
下面我们详细分析一下get()函数。首先检测缓冲区中是否已经有单词了,如果有就直接返回该单词:
只有当full为false时(表明缓冲区中没有单词),我们才需要处理输入字符。此时,我们逐个读入字符并进行适当的处理,在其中寻找括号、运算符和数字,遇到任何其他字符我们都将调用error()而结束程序:
error()函数在5.6.3节中描述,我们将其声明包含在std_lib_facilities.h文件中。
我们必须考虑如何表示不同类型的单词,也就是说,必须为kind成员选择不同的值。简单起见,也为了易于调试,我们令一个单词的kind域就保存括号、运算符本身。这使得括号和运算符的处理异常简单:
坦率地讲,我们在第1版中忘记了处理表示“立即输出结果”的‘;’和表示“退出”的‘q’这两个符号,我们在第2版中将这部分代码添加进来。 ...