编译原理 第一章 词法分析
词法分析器的作用
词法分析器(scanner), 在第〇章我们已经说过它的作用: 识别所有标识符并对其标记属性信息. 这篇内容讲解这个过程是如何实现的.
首先, 先引入三个概念: 串, 单词与模式. 串就是我们通常说的字符串, 是一个一维的逻辑结构, 按照某个特定顺序存储了一些符号; 单词就是符合某一模式的串; 那么什么是模式呢? 简单的说就是字符的形成规则. 比如在 C 中, 我们知道变量的名字由字母, 数字, 以及下划线组成, 且数字不可以出现在首位. 除此之外, 变量名不可以与保留字相同(比如不可以"int for = 3;"). 这就是一条规则. 根据这个模式(规则)我们可以识别出给定字符串的若干字串, 这些字串便是满足这一模式的单词.
有了上面的概念, 我们便可以进一步描述词法分析器的任务: 根据约定的模式, 识别出串中的单词, 并标记其属性信息(比如识别出一个数字常量, 它的属性可能是它的存储类型(可能涉及类型转换)以及数字的值, 识别出一个操作符; 它的属性可能是它代表的操作含义;).
举个例子, 我们有串"float aaa = bb 12.23". 我们有这样的几个规则(并非C标准), "float 是类型名, 指的是浮点数", "变量名由字母组成", " 是操作符, 指的是乘法", "数字常量由数字(+ "." + 数字)". 经过词法分析器, 我们应该可以得到这样的记号流: "<TYPE, FLOAT> <ID, "aaa"> <OP, SET> <ID, "bbb"> <OP, MUL> <NUM, FLOAT, "12.23">".
通常在识别单词的时候, 可能会发现有些串有二义性. 也就是说同一个串可能符合多个模式. 比如, "while"是 C 的保留字, 但是我的变量名可以定义为"while_count_ge_0".