编译的整个过程从词法分析开始。从左至右逐个字符地对源程序进行扫描,按照源语言的词法规则识别出一个个单词符号,把识别出来的标识符存入符号表中,并产生用于语法分析的记号序列。另外,词法分析程序还可以完成用户接口有关的一些任务,如识别源程序中的注释和跳过空格,把来自编译程序的错误信息和源程序联系起来。在遇到错误时,为了使词法分析程序能够继续运行下去,还要对出现的错误进行适当的恢复。
    词法分析的输入是用源语言编写的程序,输出是详细词法错误信息及记号序列。记号指的是某一类单词的类别编码,如常数的记号num,而单词指的是某一类单词符号中的一个实例,如标识符position就是一个单词。我们计划利用LEX进行词法分析。
    LEX能够自动生成词法分析程序的前提就是我们能够提供所有单词的模式。一般来说,在输入符号串中有很多子串具有相同的记号输出,每个这样的子串都是一个单词,并且都可以用同一构成规则(即模式或者说正则表达式)描述。所以需要给出所有记号的正则表达式(描述记号的模式)的定义。为此,我们要根据提供的文法和语法图,以及相关文档,学习PASCAL_S,从中整理出各个不同种类的单词(包括常数、标识符、各种关键字等),然后再分析得到正则表达式。在分析过程中,可以利用正则文法、自动机等辅助分析。
    LEX通过正则表达式的匹配,执行相应的动作。而我们需要输出记号序列。词法分析程序在识别出一个记号后,要把与之有关的信息作为它的属性保留下来,记号影响语法分析的决策,属性影响记号的翻译。如果每一个关键字、运算符或标点符号作为单独的一类,则记号所代表的单词是唯一的,所以属性域可以是空的。若记号所代表的单词不唯一,则需要给出属性。
    LEX遵循最长匹配和优先匹配规则。值得注意的一些词法约定细节有:1)标识符长度受限;2)PASCAL不区分大小写,在分析中识别出一个单词,要马上将其所有字母转化为小写(字符常量、关键字除外);3)PASCAL语言程序的注释规则是注释用一对花括号括起来,编译程序要能处理注释,并将注释以某种形式保存下来,以便代码生成部分能够在恰当的部分用C语言的形式恢复注释。
    词法分析阶段的错误主要就是读到非法字符(不属于该语言的字符集的字符),通常的做法是跳过非法字符,继续进行词法分析,同时需要输出详细的词法错误列表(错误发生的行数等),以便程序员修改词法错误。