词法分析
词法分析是编译器的第一步,他的工作是将一个长长的字符串识别出一个个的单词,比如 int age = 43;
,需要识别出如下这些 Token
:
int: int 关键字
age: 标识符
=: 等号
43: 整型字面量
;: 分号
复制代码
词法分析可以借助有限状态机来完成。
有限状态机
为了简单起见,假设我们的输入字符串中只有字母、数字、分号、空白(包括空格、制表符、换行),则我们的有限状态机如下图所示:
我们用黑色框表示状态,蓝色框表示生成的 Token
,黑色实线表示从某状态迁移到另一状态,其中线上的文字表示状态迁移的条件,同时每当状态恢复到初始状态时都会产生一个 Token
,我们用虚线的箭头来表示。
我们用 int age = 43;
来模拟一下有限状态机的工作过程:
- 初始状态。
- 遇到
i
, 转移到int 关键字第一个字符
状态。 - 遇到
n
, 转移到int 关键字第二个字符
状态。 - 遇到
t
, 转移到int 关键字第三个字符
状态。 - 遇到
空格
, 转移到初始状态,同时生成一个类型为int 关键字
的Token
。 - 连续遇到三个字母
a
g
e
,然后遇到一个空格
,转移到初始状态,同时生成一个类型为标识符
的Token
。 - 遇到
=
,生成一个类型为等号
的Token
。 - 连续遇到两个数字
4
3
,然后遇到一个空格
,转移到初始状态,同时生成一个类型为整型字面量
的Token
。 - 遇到
=
,生成一个类型为分号
的Token
。
明白了这个例子,再加入其它的一些状态和 Token
,就可以实现一个简单的词法分析器了。具体实现详见代码。
注意到,像这样的代码 int 3a;
我们会识别为:
int: int 关键字
3: 整型字面量
a: 标识符
;: 分号
复制代码
虽然很明显这是个不合法的语句,但是这种情况在词法分析阶段是没有问题的。识别出这是一个非法语句是语法阶段的工作,词法分析阶段只需要兢兢业业的生成一个个 Token
。计算机科学的分层思想真的是随处可见。