编译系统透视:图解编译原理
上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”,在词法阶段仅能判断这是一个标识符,但是如果不对所在的句做分析,就无法得知这个标识符代表一个变量还是一个函数。更多详细的信息需要对符号所在的句型做分析才能获得。这部分工作由语法分析来完成。