编译程序的整个工作过程,是从接收字符串形式的源程序文件作为输入,并对此输入串进行词法分析开始的。词法分析的任务就在于依次扫视输入串中的各个字符,并从其中识别出一系列具有独立意义的基本语法单位—单词(token,也称为记号)。对程序语言来说,关键字(如i f,for,while,begin,end等)、标识符、各种常数、各种运算符(如+、* 、>、> = 、> >、+ = 、A等)及分隔符(如逗号、冒号、分号及括号等)都是单词。我们通常把构成各个单词的字符串(如whiie、>=等)称为该单词的词文(lexeme)。
作为词法分析的结果,通常是把从源程序中所识别出的各个单词的词文转换为某种内部表示,并依次进行输出。而此种内部编码形式的单词串,将作为语法分析程序的输入和编译程序后续相关工作阶段的处理对象。可见,词法分析是整个编译工作的基础。
1、源程序的输入及预处理
在词法分析过程中,编译程序是通过操作系统从外部介质(如磁盘、软盘及终端键盘等)来读取源程序文件中的各个字符的。同时,为正确地识别单词,有时还需进行超前搜索和回退字符等操作。因此,为了提高读盘效率和便于扫描器进行工作,通常可采用缓冲输入的方案,即在内存中设置一个适当大小的输人缓冲区,让操作系统直接将磁盘上的源程序字符串分批送入此缓冲区中,供扫描器进行处理。
从磁盘中读取信息,必须以扇区为单位(因为任何磁盘的存储空间都是按扇区划分的),即使仅需从磁盘读取一个字节,操作系统亦须将整个扇区都读入缓冲区,然后再从缓冲区读取一个字节。为了提高访问磁盘的效率,一些操作系统(例如MS-DOS)甚至规定将一组扇区,即所谓簇(duster)或块(block),作为直接访问的最小单位。通常,我们把能直接从磁盘中读取的最小字节数称为分配单位(allocation unit)。换言之,每次从磁盘所读取的字节数应是分配单位的倍数。一般而言,缓冲区愈大则读盘时间开销愈小。