实验内容及要求:
(1)C++源代码扫描程序识别C++记号。
C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。
(2)打开一个C++源文件,打印出所有以上的记号。
(3)要求应用程序应为Windows界面。
(4)选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。因此,程序中还应该有这样的压缩功能。
(5)选作部分:进一步思考或实现——如何进一步实现减小源文件大小的压缩功能。
思路:
(1)由于需要处理特殊字符等,因此只能逐个字符扫描;
(2)观察上述要求的记号:标识符、关键字、数、特殊符号、运算符号(暂时不考虑注释和字符串,比较特殊后面再进行处理),可以发现这些记号几乎都被特殊符号分割开来了,如空格符、换行符、制表符、逗号、分号等;
(3)分词: 也就是说我们再逐个字符扫描的时候,若遇到这些特殊字符,要么就是某个记号的结束,或者记号本身(分号、逗号也是记号,即特殊符号);而我们扫描过程中,正在处理的字符若不是特殊符号,可以暂存起来,直到遇到结束符,然后把之前缓存起来的字符组合成一个词;
(4)类型判断:经过一轮扫描之后,我们就会得到一个个划分号的词,此时再进行记号类型的判断就容易多了;
(5)当然,除了注释和字符串需要特殊处理外,还有一些特殊字符不一定只有一个字节,比如(++,--)这些是两个字符作为一个整体,若按上面进行分词,这些记号就会被切分开来,不符合要求;这里我们也可以把无法判断是否多个字节的特殊字符缓存起来,等到下一个能确定结束的字符再进行处理;