第1章 引論 1
1.1 什麼是編譯程序 1
1.2 編譯過程和編譯程序的結構 2
1.2.1 編譯過程概述 2
1.2.2 編譯程序的結構 5
1.2.3 編譯階段的組閤 6
1.3 解釋程序和一些軟件工具 7
1.3.1 解釋程序 7
1.3.2 處理源程序的軟件工具 8
1.4 PL/0語言編譯係統 10
1.4.1 PL/0語言編譯係統構成 11
1.4.2 PL/0語言 11
1.4.3 類P-code語言 14
1.4.4 PL/0編譯程序 15
1.4.5 PL/0語言編譯係統的驅動代碼 16
練習 18
第2章 文法和語言 19
2.1 文法的直觀概念 19
2.2 符號和符號串 20
2.3 文法和語言的形式定義 21
2.4 文法的類型 25
2.5 上下文無關文法及其語法樹 26
2.6 句型的分析 29
2.6.1 自上而下的分析方法 30
2.6.2 自下而上的分析方法 30
2.6.3 句型分析的有關問題 31
2.7 有關文法實際應用的一些說明 32
2.7.1 有關文法的實用限製 32
2.7.2 上下文無關文法中的ε規則 33
練習 33
第3章 詞法分析 37
3.1 詞法分析程序的設計 37
3.1.1 詞法分析程序和語法分析程序的接口方式 37
3.1.2 詞法分析程序的輸齣 37
3.1.3 將詞法分析工作分離的考慮 38
3.1.4 詞法分析程序中如何識彆單詞 39
3.2 PL/0編譯程序中詞法分析程序的設計和實現 39
3.3 單詞的形式化描述工具 44
3.3.1 正規文法 44
3.3.2 正規式 45
3.3.3 正規文法和正規式的等價性 46
3.4 有窮自動機 47
3.4.1 確定的有窮自動機(DFA) 47
3.4.2 不確定的有窮自動機(NFA) 49
3.4.3 NFA轉換為等價的DFA 50
3.4.4 確定有窮自動機的化簡 52
3.5 正規式和有窮自動機的等價性 54
3.6 正規文法和有窮自動機的等價性 57
3.7 詞法分析程序的自動構造工具 58
3.7.1 lex描述文件中使用的正規錶達式 59
3.7.2 lex描述文件的格式 60
3.7.3 lex的使用 63
3.7.4 與yacc的接口約定 63
練習 64
第4章 自頂嚮下語法分析方法 68
4.1 確定的自頂嚮下分析思想 68
4.2 LL(1)文法的判彆 72
4.3 某些非LL(1)文法到LL(1)文法的等價變換 77
4.3.1 提取左公共因子 77
4.3.2 消除左遞歸 80
4.4 不確定的自頂嚮下分析思想 84
4.5 LL(1)分析的實現 86
4.5.1 遞歸下降LL(1)分析程序 86
4.5.2 錶驅動LL(1)分析程序 92
4.6 LL(1)分析中的齣錯處理 95
4.6.1 應急恢復 95
4.6.2 短語層恢復 96
4.6.3 PL/0語法分析程序的錯誤處理 98
練習 99
第5章 自底嚮上優先分析 103
5.1 自底嚮上優先分析概述 104
5.2 簡單優先分析法 104
5.2.1 優先關係定義 105
5.2.2 簡單優先文法的定義 106
5.2.3 簡單優先分析法的操作步驟 106
5.3 算符優先分析法 107
5.3.1 直觀算符優先分析法 107
5.3.2 算符優先文法的定義 108
5.3.3 算符優先關係錶的構造 110
5.3.4 算符優先分析算法 115
5.3.5 優先函數 117
5.3.6 算符優先分析法的局限性 121
練習 121
第6章 LR分析 123
6.1 LR分析概述 123
6.2 LR(0)分析 124
6.2.1 可歸前綴和子前綴 125
6.2.2 識彆活前綴的有限自動機 127
6.2.3 活前綴及可歸前綴的一般計算方法 128
6.2.4 LR(0)項目集規範族的構造 130
6.3 SLR(1)分析 137
6.4 LR(1)分析 144
6.4.1 LR(1)項目集族的構造 145
6.4.2 LR(1)分析錶的構造 146
6.5 LALR(1)分析 148
6.6 二義性文法在LR分析中的應用 153
練習 156
第7章 語法製導的語義計算 160
7.1 基於屬性文法的語義計算 160
7.1.1 屬性文法 160
7.1.2 遍曆分析樹進行語義計算 164
7.1.3 S-屬性文法和L-屬性文法 166
7.1.4 基於S-屬性文法的語義計算 166
7.1.5 基於L-屬性文法的語義計算 168
7.2 基於翻譯模式的語義計算 172
7.2.1 翻譯模式 172
7.2.2 基於S-翻譯模式的語義計算 173
7.2.3 基於L-翻譯模式的自頂嚮下語義計算 174
7.2.4 基於L-翻譯模式的自底嚮上語義計算 178
7.3 分析和翻譯程序的自動生成工具yacc 183
7.3.1 yacc描述文件 184
7.3.2 使用yacc的一個簡單例子 187
練習 189
第8章 靜態語義分析和中間代碼生成 195
8.1 符號錶 195
8.1.1 符號錶的作用 195
8.1.2 符號的常見屬性 196
8.1.3 符號錶的實現 197
8.1.4 符號錶體現作用域與可見性 197
8.1.5 實例: PL/0編譯程序中符號錶的設計與實現 199
8.2 靜態語義分析 203
8.2.1 靜態語義分析的主要任務 203
8.2.2 類型檢查 204
8.3 中間代碼生成 208
8.3.1 常見的中間錶示形式 208
8.3.2 生成抽象語法樹 210
8.3.3 生成三地址碼 211
8.4 多遍的方法 220
練習 223
第9章 運行時存儲組織 229
9.1 運行時存儲組織概述 229
9.1.1 運行時存儲組織的作用與任務 229
9.1.2 程序運行時存儲空間的布局 230
9.1.3 存儲分配策略 231
9.2 活動記錄 234
9.2.1 過程活動記錄 234
9.2.2 嵌套過程定義中非局部量的訪問 236
9.2.3 嵌套程序塊的非局部量訪問 239
9.2.4 動態作用域規則和靜態作用域規則 240
9.3 過程調用 241
9.4 PL/0編譯程序的運行時存儲組織 243
9.4.1 PL/0程序運行棧中的過程活動記錄 244
9.4.2 實現過程調用和返迴的類P-code指令 245
9.5 麵嚮對象語言存儲分配策略 247
9.5.1 類和對象的角色 247
9.5.2 麵嚮對象程序運行時的特徵 247
9.5.3 對象的存儲組織 248
9.5.4 例程的動態綁定 249
9.5.5 其他話題 251
練習 251
第10章 代碼優化和目標代碼生成 255
10.1 基本塊、流圖和循環 255
10.1.1 基本塊 255
10.1.2 流圖 256
10.1.3 循環 257
10.2 數據流分析基礎 258
10.2.1 數據流方程的概念 259
10.2.2 到達-定值數據流分析 259
10.2.3 活躍變量數據流分析 262
10.2.4 幾種重要的變量使用數據流信息 263
10.3 代碼優化技術 268
10.3.1 窺孔優化 270
10.3.2 局部優化 271
10.3.3 循環優化 275
10.3.4 全局優化 278
10.4 目標代碼生成技術 279
10.4.1 目標代碼生成的主要環節 280
10.4.2 一個簡單的代碼生成過程 282
10.4.3 高效使用寄存器 285
10.4.4 圖著色寄存器分配 288
10.4.5 PL/0編譯器的目標代碼生成程序 289
練習 292
第11章 課程設計 296
11.1 基於PL/0編譯器的課程設計 296
11.2 基於Decaf編譯器的課程設計 297
11.2.1 Decaf編譯器實驗的總體結構 298
11.2.2 詞法和語法分析(階段一) 300
11.2.3 語義分析(階段二) 303
11.2.4 中間代碼生成(階段三) 309
11.2.5 代碼優化(階段四) 317
11.2.6 目標代碼生成(階段五) 320
11.2.7 基於Decaf編譯器的課程設計 333
11.3 軟件包相關信息說明 335
第12章 編譯器和相關工具實例——GCC/Binutils 336
12.1 開源編譯器GCC 336
12.1.1 GCC介紹 337
12.1.2 GCC總體結構 338
12.1.3 GCC編譯流程 339
12.1.4 GCC代碼組織 341
12.1.5 小結 341
12.2 開源工具Binutils 341
12.2.1 目標文件 341
12.2.2 匯編器和鏈接器 342
12.2.3 其他工具 343
12.2.4 小結 343
12.3 編譯器和工具使用實例 343
12.3.1 編譯特定版本的編譯器 343
12.3.2 查看目標文件 347
12.3.3 程序代碼優化 349
12.3.4 小結 353
練習 353
附錄A PL/0編譯程序文本 354
參考文獻 398
· · · · · · (
收起)