《高等學(xué)校計算機規(guī)劃教材:編譯原理(第3版)》根據(jù)高等學(xué)校“編譯原理”課程教學(xué)基本要求編寫。全書系統(tǒng)介紹了編譯程序的一般構(gòu)造原理、基本設(shè)計方法和主要實現(xiàn)技術(shù)。內(nèi)容包括:文法和語言基本知識、詞法分析程序的設(shè)計原理與構(gòu)造方法、各種語法分析技術(shù)、語法制導(dǎo)翻譯技術(shù)與中間代碼生成、符號表的組織和管理、代碼優(yōu)化、運行時存儲空間的組織與管理、目標(biāo)代碼生成、并行編譯技術(shù)基本常識等。
《高等學(xué)校計算機規(guī)劃教材:編譯原理(第3版)》系統(tǒng)性強,概念清晰,內(nèi)容簡明通俗,每章配有本章學(xué)習(xí)導(dǎo)讀、本章小結(jié)、自測練習(xí)題和習(xí)題。附錄給出了自測練習(xí)題與習(xí)題參考答案及編譯程序?qū)嶒灒陡叩葘W(xué)校計算機規(guī)劃教材:編譯原理(第3版)》還免費提供電子課件和實驗源代碼。
《高等學(xué)校計算機規(guī)劃教材:編譯原理(第3版)》可作為高等學(xué)校計算機專業(yè)本科生教材,也可作為成人教育本科和專升本學(xué)生的教材,對相關(guān)工程技術(shù)人員也有參考價值。
第1章 編譯概述
1.1 翻譯程序與編譯程序
1.2 編譯過程和編譯程序的基本結(jié)構(gòu)
1.3 編譯程序的生成方法
1.4 編譯技術(shù)在軟件開發(fā)中的應(yīng)用
本章小結(jié)
擴展閱讀
自測練習(xí)題1
習(xí)題1
第2章 文法和語言的基本知識
2.1 概述
2.2 字母表和符號串的基本概念
2.2.1 字母表和符號串
2.2.2 符號串的運算
2.3 文法和語言的形式定義
2.3.1 形式語言
2.3.2 文法的形式定義
2.3.3 語言的形式定義
2.3.4 規(guī)范推導(dǎo)和規(guī)范歸約
2.3.5 遞歸規(guī)則與文法的遞歸性
2.4 短語、直接短語和句柄
2.4.1 短語和直接短語
2.4.2 句柄
2.5 語法樹與文法的二義性
2.5.1 推導(dǎo)和語法樹
2.5.2 文法的二義性
2.5.3 文法二義性的消除
2.6 文法和語言的分類
2.7 有關(guān)文法的實用限制和變換
本章小結(jié)
擴展閱讀
自測練習(xí)題2
習(xí)題2
第3章 詞法分析與有窮自動機
3.1 詞法分析程序的功能
3.2 單詞符號及輸出單詞的形式
3.2.1 語言的單詞符號
3.2.2 詞法分析程序輸出單詞的形式
3.3 語言單詞符號的兩種定義方式
3.3.1 正規(guī)式與正規(guī)集
3.3.2 正規(guī)文法與正規(guī)式
3.4 正規(guī)式與有窮自動機
3.4.1 確定有窮自動機(DFA)
3.4.2 非確定有窮自動機(NFA)
3.4.3 由正規(guī)表達式R構(gòu)造NFA
3.4.4 NFA確定化為DFA的方法
3.4.5 DFA的化簡
3.4.6 有窮自動機到正規(guī)式的轉(zhuǎn)換
3.5 正規(guī)文法與有窮自動機
3.5.1 右線性正規(guī)文法到有窮自動機的轉(zhuǎn)換方法
3.5.2 左線性正規(guī)文法到有窮自動機的轉(zhuǎn)換方法
3.5.3 有窮自動機到正規(guī)文法的轉(zhuǎn)換方法
3.6 詞法分析程序的編寫方法
本章小結(jié)
擴展閱讀
自測練習(xí)題3
習(xí)題3
第4章 語法分析
4.1 語法分析程序的功能
4.2 自上而下分析法
4.2.1 非確定的自上而下分析法的思想
4.2.2 文法的左遞歸性和回溯的消除
4.2.3 某些非LL(1)文法到LL(1)文法的改寫
4.2.4 遞歸下降分析法
4.2.5 預(yù)測分析法與預(yù)測分析表的構(gòu)造
4.3 自下而上分析法的一般原理
4.4 算符優(yōu)先分析法
4.4.1 方法概述
4.4.2 算符優(yōu)先文法的定義
4.4.3 算符優(yōu)先關(guān)系表的構(gòu)造
4.4.4 算符優(yōu)先分析算法的設(shè)計
4.4.5 優(yōu)先函數(shù)的構(gòu)造
4.4.6 算符優(yōu)先分析法的局限性
4.5 LR分析法
4.5.1 LR分析器的工作原理和過程
4.5.2 LR(0)分析法
4.5.3 SLR(1)分析法
4.5.4 LR(1)分析法
4.5.5 LALR(1)分析法
4.5.6 LR分析法對二義性文法的應(yīng)用
4.5.7 LR語法分析中的錯誤恢復(fù)技術(shù)
本章小結(jié)
擴展閱讀
自測練習(xí)題4
習(xí)題4
第5章 語法制導(dǎo)翻譯技術(shù)和中間代碼生成
5.1 概述
5.2 屬性文法
5.3 語法制導(dǎo)翻譯概述
5.4 中間語言
5.4.1 逆波蘭式
5.4.2 三元式和樹形表示
5.4.3 四元式和三地址代碼
5.5 自下而上語法制導(dǎo)翻譯
5.5.1 簡單算術(shù)表達式和賦值語句的翻譯
5.5.2 布爾表達式的翻譯
5.5.3 控制語句的翻譯
5.5.4 循環(huán)語句的翻譯
5.5.5 簡單說明語句的翻譯
5.5.6 含數(shù)組元素的賦值語句的翻譯
5.5.7 過程和函數(shù)調(diào)用語句的翻譯
5.6 遞歸下降語法制導(dǎo)的翻譯
本章小結(jié)
擴展閱讀
自測練習(xí)題5
習(xí)題5
第6章 符號表的組織與管理
6.1 符號表的作用
6.2 符號表的組織
6.3 符號表的建立和查找
本章小結(jié)
擴展閱讀
自測練習(xí)題 6
習(xí)題6
第7章 代碼優(yōu)化
7.1 優(yōu)化概述
7.2 局部優(yōu)化
7.2.1 劃分基本塊的方法
7.2.2 基本塊的DAG表示
7.2.3 利用DAG進行基本塊的優(yōu)化處理
7.3 循環(huán)優(yōu)化
7.3.1 程序流圖與循環(huán)
7.3.2 循環(huán)查找
7.3.3 循環(huán)優(yōu)化
7.4 窺孔優(yōu)化
本章小結(jié)
擴展閱讀
自測練習(xí)題 7
習(xí)題7
第8章 運行時的存儲組織與管理
8.1 概述
8.2 靜態(tài)存儲分配
8.3 棧式存儲分配
8.3.1 簡單棧式存儲分配
8.3.2 嵌套過程的棧式存儲分配
8.4 堆式存儲分配
8.5 臨時變量的存儲分配
本章小結(jié)
擴展閱讀
自測練習(xí)題 8
習(xí)題8
第9章 目標(biāo)代碼生成
9.1 概述
9.2 假想的計算機模型
9.3 簡單代碼生成器
9.3.1 待用信息與活躍信息
9.3.2 代碼生成算法
9.3.3 寄存器的分配
9.4 代碼生成器的自動生成技術(shù)
本章小結(jié)
擴展閱讀
自測練習(xí)題 9
習(xí)題9
第10章 并行編譯技術(shù)基本常識
10.1 并行編譯技術(shù)的引入
10.2 并行編譯系統(tǒng)的功能和結(jié)構(gòu)
10.2.1 并行編譯系統(tǒng)的功能
10.2.2 并行編譯系統(tǒng)的結(jié)構(gòu)
10.3 向量語言編譯技術(shù)
10.3.1 向量語法處理
10.3.2 向量結(jié)構(gòu)優(yōu)化
10.4 共享存儲器并行機并行編譯技術(shù)
10.4.1 預(yù)編譯
10.4.2 可再入的目標(biāo)代碼
本章小結(jié)
習(xí)題10
附錄A 詞法分析程序生成器
A.1 詞法分析程序生成器LEX簡介
A.2 LEX輸入文件的格式
A.3 正規(guī)表達式的LEX約定
A.4 LEX源程序中的規(guī)則部分
A.5 FLEX的命令選項
A.6 LEX程序示例
附錄B 語法分析程序生成器YACC
B.1 語法分析程序YACC簡介
B.2 YACC輸入文件的格式
B.3 YACC各部分的書寫格式
B.3.1 定義部分
B.3.2 規(guī)則部分
B.3.3 輔助程序部分
B.4 YACC的內(nèi)置名稱和定義機制
B.5 YACC源程序示例
附錄C 編譯程序?qū)嶒?br />C.1 詞法分析
C.1.1 實驗?zāi)康?br />C.1.2 實驗要求
C.1.3 詞法分析程序的算法思想
C.1.4 詞法分析程序的C語言程序框架
C.2 語法分析
C.2.1 實驗?zāi)康?br />C.2.2 實驗要求
C.2.3 語法分析程序的算法思想
C.2.4 語法分析程序的C語言程序框架
C.3 語義分析
C.3.1 實驗?zāi)康?br />C.3.2 實驗要求
C.3.3 語義分析程序的C語言程序框架
C.4 算符優(yōu)先分析法
C.5 實驗實例
C.6 正規(guī)式轉(zhuǎn)換成自動機的圖形表示
C.6.1 實驗?zāi)康?br />C.6.2 實驗要求
C.6.3 參考設(shè)計思路
C.6.4 參考算法
附錄D 自測練習(xí)題與習(xí)題參考答案
參考文獻
編譯程序的重要功能之一,是記錄源程序中所使用的變量的名字,并且收集與名字屬性相關(guān)的各種信息。名字屬性包括一個名字的存儲分配、類型、作用域等信息。如果名字是一個函數(shù)名,還會包括其參數(shù)數(shù)量、類型、參數(shù)的傳遞方式以及返回類型等信息。符號表數(shù)據(jù)結(jié)構(gòu)可以為變量名字創(chuàng)建記錄條目,來登記源程序中所提供的或在編譯過程中所產(chǎn)生的這些信息,編譯程序在工作過程的各個階段需要構(gòu)造、查找、修改或存取有關(guān)表格中的信息,因此在編譯程序中必須有一組管理各種表格的程序。
如果編譯程序只處理正確的程序,那么它的設(shè)計和實現(xiàn)將會大大簡化。但是程序設(shè)計人員還期望編譯程序能夠幫助定位和跟蹤錯誤。無論程序員如何努力,程序中難免總會有錯誤出現(xiàn)。雖然錯誤很常見,但很少有語言在設(shè)計的時候就考慮到錯誤處理問題。大部分程序設(shè)計語言的規(guī)范沒有規(guī)定編譯程序應(yīng)該如何處理錯誤;錯誤處理方法由編譯程序的設(shè)計者決定。因此,從一開始就計劃好如何進行錯誤處理,不僅可以簡化編譯程序的結(jié)構(gòu),還可以改進錯誤處理方法。一個好的編譯程序在編譯過程中,應(yīng)具有廣泛的程序查錯能力,并能準確地報告錯誤的種類及出錯位置,以便用戶查找和糾正,因此在編譯程序中還必須有一個出錯處理程序。
編譯過程的這5個階段的任務(wù)分別由5個程序完成,這5個程序分別稱為詞法分析程序、語法分析程序、語義分析及中間代碼生成程序、代碼優(yōu)化程序和目標(biāo)代碼生成程序,另外再加上表格管理程序和出錯處理程序。這些程序便是編譯程序的主要組成部分,一個典型的編譯程序結(jié)構(gòu)如圖1.5所示。
需要注意的是,圖中所給出的各個階段之間的關(guān)系是指它們之間的邏輯關(guān)系,不一定是執(zhí)行時間上的先后關(guān)系。實際上,可按不同的執(zhí)行流程來組織上述各階段的工作,這在很大程度上依賴于編譯過程中對源程序掃描的遍數(shù)以及如何劃分各遍掃描所進行的工作。此處所說的“遍”,是指對源程序或其等價的中間語言程序從頭到尾掃描一遍,并完成規(guī)定加工處理工作的過程。例如,可以將前述5個階段的工作結(jié)合在一起,對源程序從頭到尾掃描一遍來完成編譯的各項工作,這種編譯程序稱為一遍掃描的編譯程序。
……