本書系統(tǒng)地介紹了編譯程序的設(shè)計原理及實現(xiàn)技術(shù)。在內(nèi)容的組織上,本書強調(diào)知識的實用性,有機地結(jié)合了編譯的基本理論與具體的實現(xiàn)技術(shù),既注重理論的完整性,化繁為簡,又將理論融于具體的實例中,化難為易,以達到準確、清楚地闡述相關(guān)概念和原理的目的。在具體內(nèi)容的講述中,思路清晰、條理分明,給出的示例豐富,實用性與連貫性強,可使讀者全面、直觀地認識編譯的各個階段。本書采用的算法全部由C語言描述,各章均附有習(xí)題,且附錄中提供了習(xí)題解答。本書既可作為計算機本科專業(yè)學(xué)生的教材,又可作為計算機軟件工程人員的參考資料。
費蓉,博士,教授。作者主要承擔(dān)計算方法、大學(xué)生計算機基礎(chǔ)、軟件工具與環(huán)境、專業(yè)英語等本科課程,目前從事隨機環(huán)境建模分析、優(yōu)化算法等方面的研究。主持國家自然科學(xué)基金、陜西省技術(shù)轉(zhuǎn)移促進、西安市科技計劃等縱向課題10余項,橫向課題近10項;在國內(nèi)外重要學(xué)術(shù)期刊和相關(guān)國際學(xué)術(shù)會議上公開發(fā)表學(xué)術(shù)論文近30篇,其中SCI檢索10余篇;授權(quán)國家發(fā)明專利3項,國際發(fā)明專利1項,獲批軟件著作權(quán)30余項;指導(dǎo)學(xué)生獲得"互聯(lián)網(wǎng)+”大學(xué)生創(chuàng)新創(chuàng)業(yè)大賽、全國大學(xué)生服務(wù)外包大賽等多項省級、國家級大獎。參加的學(xué)術(shù)組織及任職:IEEE會員,ACM會員,CCF會員。個人/集體榮譽:獲2015年西安理工大學(xué)校級講課比賽三等獎,作為主要參與人獲2017年度校級教學(xué)成果一等獎,作為主要參與人獲2015、2019年度陜西省高等學(xué)校科學(xué)技術(shù)獎一等獎兩項,2016年度陜西省科學(xué)技術(shù)獎二等獎一項。承擔(dān)過的重點科研項目:作為主要參與人(4/5)獲2017年度校級教學(xué)成果一等獎,作為主要參與人(4/7)(6/11)獲2015、2019年度陜西省高等學(xué)校科學(xué)技術(shù)獎一等獎兩項,2016年度陜西省科學(xué)技術(shù)獎二等獎一項。教學(xué)成果獲獎情況:第二主編胡元義主持的《計算機專業(yè)核心學(xué)位課程教材建設(shè)(教材)》獲2015年校教學(xué)成果一等獎,《改革實驗教學(xué)模式的實驗教材建設(shè)(教材)》獲2012年校教學(xué)成果一等獎,《提高本科教學(xué)質(zhì)量,不斷進行計算機教學(xué)實踐創(chuàng)新》和《編譯原理系列教材建設(shè)》分獲2003和2007年校教學(xué)成果二等獎;本人參與的《突出實踐,全面提高計算機專業(yè)本科培養(yǎng)質(zhì)量》和《抓質(zhì)量工程建設(shè),促創(chuàng)新型應(yīng)用人才培養(yǎng)》分獲2007和2009年校教學(xué)成果特等獎;主編的《數(shù)據(jù)結(jié)構(gòu)教程》獲2015校優(yōu)秀教材二等獎,主編的《編譯原理教程》(第一版)獲2007校優(yōu)秀教材二等獎,主編的《編譯原理教程》(第三版)獲2016校優(yōu)秀教材一等獎,主編的《C語言程序設(shè)計教程》獲2016校優(yōu)秀教材二等獎。出版著作情況:(1)《數(shù)據(jù)結(jié)構(gòu)教程》、《數(shù)據(jù)結(jié)構(gòu)教程習(xí)題解析與上機指導(dǎo)》胡元義、黑新宏、魯曉峰、費蓉等,西安電子科技大學(xué)出版社2012;(2)《操作系統(tǒng)原理》胡元義、費蓉等,電子工業(yè)出版社,2018。
目 錄
第1章 緒論 1
1.1 程序設(shè)計語言和編譯程序 1
1.2 編譯程序的歷史及發(fā)展 3
1.3 編譯過程和編譯程序結(jié)構(gòu) 4
1.4 編譯程序的開發(fā) 6
1.5 構(gòu)造編譯程序所應(yīng)具備的知識內(nèi)容 7
習(xí)題1 8
第2章 詞法分析 10
2.1 詞法分析器的設(shè)計方法 10
2.1.1 單詞符號的分類與輸出形式 10
2.1.2 狀態(tài)轉(zhuǎn)換圖 11
2.2 一個簡單的詞法分析器示例 13
2.2.1 C語言子集的單詞符號表示 13
2.2.2 C語言子集對應(yīng)的狀態(tài)轉(zhuǎn)換圖 14
2.2.3 狀態(tài)轉(zhuǎn)換圖的實現(xiàn) 15
2.3 正規(guī)表達式與有限自動機簡介 17
2.3.1 正規(guī)表達式與正規(guī)集 17
2.3.2 有限自動機 18
2.4 正規(guī)表達式到有限自動機的構(gòu)造 21
2.4.1 由正規(guī)表達式構(gòu)造等價的非確定有限自動機 21
2.4.2 NFA的確定化 22
2.4.3 確定有限自動機(DFA)的化簡 24
2.4.4 正規(guī)表達式到有限自動機構(gòu)造示例 26
2.5 詞法分析器的自動生成 31
習(xí)題2 33
第3章 文法和語言 36
3.1 基本概念 36
3.1.1 文法和語言的定義 36
3.1.2 文法產(chǎn)生的語言 38
3.2 形式語言分類 39
3.2.1 四類文法的劃分 39
3.2.2 四類文法的關(guān)系與區(qū)別 40
3.2.3 正規(guī)表達式與上下文無關(guān)文法 42
3.3 推導(dǎo)與語法樹 43
3.3.1 推導(dǎo)與短語 43
3.3.2 語法樹與二義性 44
習(xí)題3 49
第4章 語法分析—自頂向下分析方法 51
4.1 自頂向下分析原理 51
4.1.1 自頂向下分析存在的不確定性 51
4.1.2 確定的自頂向下分析 52
4.2 遞歸下降分析法 56
4.2.1 算術(shù)表達式的遞歸下降分析器 56
4.2.2 無二義性的算術(shù)表達式遞歸下降分析器 58
4.3 LL(1)分析法 59
4.3.1 表驅(qū)動的LL(1)分析器 59
4.3.2 LL(1)分析表的構(gòu)造 62
習(xí)題4 66
第5章 語法分析—自底向上分析方法 68
5.1 自底向上分析原理 68
5.2 算符優(yōu)先分析法 70
5.2.1 算符優(yōu)先文法 70
5.2.2 算符優(yōu)先關(guān)系表的構(gòu)造 71
5.2.3 算符優(yōu)先分析算法的設(shè)計 74
5.2.4 優(yōu)先函數(shù) 78
5.3 LR分析器的工作原理 80
5.4 LR(0)分析器 86
5.4.1 LR(0)項目集規(guī)范族的構(gòu)造 86
5.4.2 LR(0)分析表的構(gòu)造 88
5.5 SLR(1)分析器 93
5.6 二義文法的應(yīng)用 99
習(xí)題5 103
第6章 語義分析和中間代碼生成 107
6.1 概述 107
6.1.1 語義分析的概念 107
6.1.2 語法制導(dǎo)翻譯方法 107
6.2 屬性文法 109
6.2.1 文法的屬性 109
6.2.2 屬性文法 110
6.3 幾種常見的中間語言 111
6.3.1 抽象語法樹 111
6.3.2 逆波蘭表示法 112
6.3.3 三地址代碼 114
6.4 表達式及賦值語句的翻譯 116
6.4.1 簡單算術(shù)表達式和賦值語句的翻譯 116
6.4.2 布爾表達式的翻譯 118
6.5 控制語句的翻譯 123
6.5.1 條件語句if的翻譯 123
6.5.2 循環(huán)語句的翻譯 125
6.5.3 三種基本控制結(jié)構(gòu)的翻譯 127
6.5.4 多分支控制語句case的翻譯 132
6.5.5 語句標號和轉(zhuǎn)移語句的翻譯 134
6.6 數(shù)組元素的翻譯 134
6.6.1 數(shù)組元素的地址計算及中間代碼形式 135
6.6.2 賦值語句中數(shù)組元素的翻譯 135
6.6.3 數(shù)組元素翻譯示例 136
6.7 過程或函數(shù)調(diào)用語句的翻譯 139
6.7.1 過程或函數(shù)調(diào)用的方法 139
6.7.2 過程或函數(shù)調(diào)用語句的四元式生成 140
6.8 說明語句的翻譯 141
6.8.1 變量說明的翻譯 141
6.8.2 數(shù)組說明的翻譯 141
6.9 遞歸下降語法制導(dǎo)翻譯方法簡介 142
習(xí)題6 143
第7章 代碼優(yōu)化 147
7.1 局部優(yōu)化 147
7.1.1 基本塊的劃分方法 147
7.1.2 基本塊的DAG方法 148
7.1.3 用DAG進行基本塊的優(yōu)化處理 152
7.1.4 DAG構(gòu)造算法的進一步討論 153
7.2 循環(huán)優(yōu)化 154
7.2.1 程序流圖與循環(huán) 154
7.2.2 循環(huán)的查找 156
7.2.3 循環(huán)優(yōu)化 161
習(xí)題7 169
第8章 目標程序運行時存儲空間的組織 173
8.1 靜態(tài)存儲分配 173
8.2 簡單的棧式存儲分配 174
8.2.1 棧式存儲分配與活動記錄 175
8.2.2 過程的執(zhí)行 176
8.3 嵌套過程語言的棧式實現(xiàn) 179
8.3.1 嵌套層次顯示表和活動記錄 179
8.3.2 嵌套過程的執(zhí)行 180
8.3.3 訪問非局部名的另一種實現(xiàn)方法 182
8.4 堆式動態(tài)存儲分配 185
8.4.1 堆式存儲的概念 185
8.4.2 堆式存儲的管理方法 186
習(xí)題8 188
第9章 目標代碼生成 190
9.1 簡單代碼生成器 190
9.1.1 待用信息與活躍信息 191
9.1.2 代碼生成算法 193
9.1.3 寄存器分配 194
9.1.4 源程序到目標代碼生成示例 196
9.2 匯編指令到機器代碼翻譯概述 198
習(xí)題9 204
第10章 符號表與錯誤處理 206
10.1 符號表 206
10.1.1 符號表的作用 206
10.1.2 符號表的組織 207
10.1.3 分程序結(jié)構(gòu)語言符號表建立 208
10.1.4 非分程序結(jié)構(gòu)語言符號表建立 211
10.1.5 常用符號表結(jié)構(gòu) 212
10.1.6 符號表內(nèi)容 213
10.2 錯誤處理 214
10.2.1 語法錯誤校正 214
10.2.2 語義錯誤校正 220
習(xí)題10 221
附錄A 8086/8088指令碼匯總表 223
附錄B 8086/8088指令編碼空間表 228
附錄C 習(xí)題解答 230
參考文獻 290