词法分析器的主要任务是读入源程序的输入字符、将它们组成词素,生成并输出一个词法单元序列,每个词法单元对应于一个词素。
当词法分析器发现了一个标识符的词素时,要将这个词素添加到符号表中。
其他任务:
- 过滤掉源程序中的注释和空白。
- 将编译器生成的错误信息与源程序的位置联系起来。记录行号等。
词法分析器的两个级联的处理阶段:
- 扫描阶段:简单处理,删除注释,压缩空白字符。
- 词法分析阶段:处理扫描阶段的输出并生成词法单元。
把编译部分分为词法分析和语法分析的原因:
- 简化编译器的设计。
- 提高编译器的效率。
- 增强编译器的可移植性。
三个术语:
- 词法单元:由一个词法单元名和一个可选的属性值构成。
- 模式:一个词法单元的词素可能具有的形式。
- 词素:源程序中的一个字符序列,他和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例。
大部分词法单元的类别:
- 每个关键字有一个词法单元。一个关键字的模式就是该关键字本身。
- 表示运算符的词法单元。可以表示单个运算符,也可以表示一类运算符。
- 表示所有标识符的词法单元。
- 一个或多个表示常量的语法单元,比如数字和字面值字符串。
- 每一个标点符号有一个词法单元,比如左右括号、逗号、分号。
属性:如果有多个词素可以和一个模式匹配,那么词法分析器向编译器的后续阶段提供有关被匹配词素的附加信息。
词法错误的恢复动作:
- 从剩余的输入中删除一个字符。
- 向剩余的输入中插入一个遗漏的字符。
- 用一个字符来替换另一个字符。
- 交换两个相邻的字符 。
恐慌模式恢复:从剩余的输入中不断删除字符,直到词法分析器能够在剩余输入的开头发现一个正确的词法单元为止。
在缓冲区为输入维护两个指针:
lexemeBegin指针:该指针指向当前词素的开始处。当前我们正试图确定这个词素的结尾。
forward指针:一直扫描,直到发现某个模式被匹配为止。
一旦确定了下一个词素,forward指针将指向该词素结尾的字符。词法分析器记录属性并返回词法单元。然后使lexemeBegin指针指向刚刚找到的词素之后的一个字符。
forward指针到达缓冲区末尾时,向缓冲区读入新的字符。
可以在缓冲区末尾添加哨兵标记。