官术网_书友最值得收藏!

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”,在詞法階段僅能判斷這是一個標識符,但是如果不對所在的句做分析,就無法得知這個標識符代表一個變量還是一個函數。更多詳細的信息需要對符號所在的句型做分析才能獲得。這部分工作由語法分析來完成。

主站蜘蛛池模板: 巨野县| 乌拉特后旗| 神池县| 武强县| 万宁市| 大庆市| 京山县| 延川县| 苗栗市| 普陀区| 鹿邑县| 云龙县| 道孚县| 萨嘎县| 武清区| 林西县| 泽普县| 成安县| 浠水县| 安义县| 霞浦县| 杭锦旗| 平武县| 靖安县| 丰县| 长乐市| 寿宁县| 阿克苏市| 成都市| 金坛市| 儋州市| 万荣县| 镇安县| 和龙市| 汉中市| 凉山| 政和县| 社会| 利津县| 府谷县| 阿拉善左旗|