编译与反编译技术实战
上QQ阅读APP看书,第一时间看更新

3.1.2 输入及其处理

词法分析器的结构如图3-1所示。词法分析器首先将源程序文本输入到一个缓冲区中,该缓冲区称为输入缓冲区,单词符号的识别可以直接在输入缓冲区中进行。但通常情况下为了识别单词的方便,需要对输入的源程序字符串进行预处理。对于许多程序语言来说,空格、制表符、换行符等编辑性字符只有出现在符号常量中时才有意义;注释几乎可以出现在程序中的任何地方。但编辑性字符和注释的存在一般只是为了改善程序的易读性和易理解性,不影响程序本身的语法结构和实际意义,通常在词法分析阶段可以通过预处理将它们删除。因此可以设计一个预处理子程序来完成上述工作,每当词法分析器调用预处理子程序时,其便处理一串固定长度的源程序字符串,并将处理结果放在词法分析器指定的缓冲区中,称为扫描缓冲区。接下来单词符号的识别就可以直接在该扫描缓冲区中进行,而不必考虑其他杂务。

图3-1 词法分析器结构图

扫描器对扫描缓冲区进行扫描时通常使用两个指针,即开始指针和搜索指针,其中,开始指针指向当前正在识别的单词的起始位置,搜索指针用于向前搜索以寻找该单词的终点位置,两个指针之间的符号串就是当前已经识别出来的那部分单词。刚开始时,两个指针都指向下一个要识别的单词符号的开始位置,然后,搜索指针向前扫描,直到发现一个单词符号为止,一旦发现一个单词,搜索指针指向该单词的右部,在处理完这个单词以后,两个指针同时指向下一个要识别的单词符号的起始位置。

为了解决程序设计语言中某些单词符号可能存在公共前缀的问题,在进行词法分析时需采用所谓超前搜索技术,也即词法分析器在读取单词时,为了判断是否已读入整个单词的全部字符,常采取向前多读取字符并通过读取的字符来判别的方式。