上QQ阅读APP看书,第一时间看更新
1.3.1 词法分析
我们仍用第一节介绍的简单案例介绍编译的总体过程。
人眼中看到的源代码是这样的:
int fun(int a,int b); int m=10; int main() { int i=4; int j=5; m = fun(i,j); return 0; } int fun(int a,int b) { int c=0; c=a+b; return c; }
而它在计算机中存储的形式如图1-36所示。
图1-36 案例程序的十六进制形式
这里看不出关键字、运算符、标识符,甚至看不出哪几个字符属于同一个符号。编译的第一阶段是词法分析,目的就是在连续的字符中识别出一个一个的符号,并尽可能地识别出符号的属性。
人们在看C语言源程序时,借助空格、括号等一眼就可以看出标识符、关键字。与人相比,现在计算机的智能还是相当低的,无法像人那样同时看多个字符,只能依据一个非常机械的“电子版”词法,一个字符一个字符地识别。“电子版”词法是将状态转换图的思路融汇在词法分析器的代码中得以体现的。词法分析器从源程序的字符串中识别出一个个符号(token),并按序保存。
词法分析的结果如图1-37所示。
图1-37 词法分析的结果
在词法分析阶段能够识别出一些符号的含义,它们包括关键字、数字、字符串、分隔符,这些符号的含义不需要其他符号的辅助就能确定本身的含义。比如,“int”一定代表整数类型,它不可能是一个变量名称,也不可能是一个运算符。
而另外一些符号需要通过前后的其他符号才能确定出准确含义。比如“m”,在词法阶段仅能判断这是一个标识符,但是如果不对所在的句做分析,就无法得知这个标识符代表一个变量还是一个函数。更多详细的信息需要对符号所在的句型做分析才能获得。这部分工作由语法分析来完成。