本書全面、深入地探討了編譯器設計方面的重要主題,包括詞法分析、語法分析、語法制導定義和語法制導翻譯、運行時刻環(huán)境、目標代碼生成、代碼優(yōu)化技術、并行性檢測以及過程間分析技術,并在相關章節(jié)中給出大量的實例。與上一版相比,本書進行了全面修訂,涵蓋了編譯器開發(fā)方面最新進展。每章中都提供了大量的實例及參考文獻。
本書是編譯原理課程方面的經(jīng)典教材,內(nèi)容豐富,適合作為高等院校計算機及相關專業(yè)本科生及研究生的編譯原理課程的教材,也是廣大技術人員的極佳參考讀物。
本書是編譯領域無可替代的經(jīng)典著作,被廣大計算機專業(yè)人士譽為“龍書”。本書上一版自1986年出版以來,被世界各地的著名高等院校和研究機構(包括美國哥倫比亞大學、斯坦福大學、哈佛大學、普林斯頓大學、貝爾實驗室)作為本科生和研究生的編譯原理課程的教材。該書對我國高等計算機教育領域也產(chǎn)生了重大影響。 第2版對每一章都進行了全面的修訂,以反映自上一版出版20多年來軟件工程。程序設計語言和計算機體系結構方面的發(fā)展對編譯技術的影響。本書全面介紹了編譯器的設計,并強調(diào)編譯技術在軟件設計和開發(fā)中的廣泛應用。每章中都包含大量的習題和豐富的參考文獻。 本書適合作為高等院校計算機專業(yè)本科生和研究生的編譯原理與技術課程的教材,也可供廣大計算機技術人員參考。1977年,Alfred V.Aho和Jeffrey D.Ullman合作出版了《Principies of CompiletDesign》,封面是一位騎士和一只恐龍,那恐龍是綠色的,因此被稱為龍書或綠龍書。1986年,原來的兩位作者加上RaviSethi,升級了前一本書,書名改為《compiIers:Principles,Techniques andTools》,封面依然沿用騎士和恐龍,那恐龍是紅色的,因此被稱為龍書二或者紅龍書。又過了一個9年又一個9年,編譯領域的巨無霸——龍書始終都沒有升級。終于在2006年底,龍書升級了。作者又增加了MonicaS.Lam,名字與龍書二相同,封面依然沿用恐龍和武士的設計,這次的龍是紫色的,因此被稱為龍書三或者紫龍書。 更多經(jīng)典圖書推薦《算法導論》第3版中文版隆重上市!點擊進入《C 程序設計語言(特別版)十周年中文紀念版》點擊進入《深入理解計算機系統(tǒng)(原書第2版)》點擊進入《算法導論(原書第2版)》點擊進入《Java編程思想第4版》點擊進入《計算機程序的構造和解釋(原書第2版)》點擊進入《數(shù)據(jù)結構與算法分析——C語言描述(原書第2版)》點擊進入《數(shù)據(jù)庫系統(tǒng)概念(原書第5版)》點擊進入 編譯領域里程碑式的經(jīng)典著作——龍書,20年后終于出版新版!這是一個延綿30年的故事,這是一部關于龍書的傳奇!**版本,增添兩章節(jié)內(nèi)容,使龍書地位更權威! 本書是編譯領域無可替代的經(jīng)典著作,被廣大計算機專業(yè)人士譽為“龍書”。本書上一版自1986年出版以來,被世界各地的著名高等院校和研究機構(包括美國哥倫比亞大學、斯坦福大學、哈佛大學、普林斯頓大學、貝爾實驗室)作為本科生和研究生的編譯原理課程的教材。該書對我國高等計算機教育領域也產(chǎn)生了重大影響! 〉2版對每一章都進行了全面的修訂,以反映自上一版出版20多年來軟件工程。程序設計語言和計算機體系結構方面的發(fā)展對編譯技術的影響。本書全面介紹了編譯器的設計,并強調(diào)編譯技術在軟件設計和開發(fā)中的廣泛應用。每章中都包含大量的習題和豐富的參考文獻! ”緯m合作為高等院校計算機專業(yè)本科生和研究生的編譯原理與技術課程的教材,也可供廣大計算機技術人員參考。1977年,Alfred V.Aho和Jeffrey D.Ullman合作出版了《Principies of CompiletDesign》,封面是一位騎士和一只恐龍,那恐龍是綠色的,因此被稱為龍書或綠龍書。1986年,原來的兩位作者加上RaviSethi,升級了前一本書,書名改為《compiIers:Principles,Techniques andTools》,封面依然沿用騎士和恐龍,那恐龍是紅色的,因此被稱為龍書二或者紅龍書。又過了一個9年又一個9年,編譯領域的巨無霸——龍書始終都沒有升級。終于在2006年底,龍書升級了。作者又增加了MonicaS.Lam,名字與龍書二相同,封面依然沿用恐龍和武士的設計,這次的龍是紫色的,因此被稱為龍書三或者紫龍書。 更多經(jīng)典圖書推薦《算法導論》第3版中文版隆重上市!點擊進入《C 程序設計語言(特別版)十周年中文紀念版》點擊進入《深入理解計算機系統(tǒng)(原書第2版)》點擊進入《算法導論(原書第2版)》點擊進入《Java編程思想第4版》點擊進入《計算機程序的構造和解釋(原書第2版)》點擊進入《數(shù)據(jù)結構與算法分析——C語言描述(原書第2版)》點擊進入《數(shù)據(jù)庫系統(tǒng)概念(原書第5版)》點擊進入
AlfredV.Aho,美國歌倫比亞大學教授,美國國家工程院院士,ACM和IEEE會士,曾獲得IEEE的馮·諾伊曼獎。著有多部算法、數(shù)據(jù)結構、編譯器、數(shù)據(jù)庫系統(tǒng)及計算機科學基礎方面的著作。
出版者的話
譯者序
前言
第1章 引論
1.1 語言處理器
1.2 一個編譯器的結構
1.2.1 詞法分析
1.2.2 語法分析
1.2.3 語義分析
1.2.4 中間代碼生成
1.2.5 代碼優(yōu)化
1.2.6 代碼生成
1.2.7 符號表管理
1.2.8 將多個步驟組合成趟
1.2.9 編譯器構造工具
1.3 程序設計語言的發(fā)展歷程
1.3.1 走向高級程序設計語言
1.3.2 對編譯器的影響
1.3.3 1.3節(jié)的練習
1.4 構建一個編譯器的相關科學
1.4.1 編譯器設計和實現(xiàn)中的建模
1.4.2 代碼優(yōu)化的科學
1.5 編譯技術的應用
1.5.1 高級程序設計語言的實現(xiàn)
1.5.2 針對計算機體系結構的優(yōu)化
1.5.3 新計算機體系結構的設計
1.5.4 程序翻譯
1.5.5 軟件生產(chǎn)率工具
1.6 程序設計語言基礎
1.6.1 靜態(tài)和動態(tài)的區(qū)別
1.6.2 環(huán)境與狀態(tài)
1.6.3 靜態(tài)作用域和塊結構
1.6.4 顯式訪問控制
1.6.5 動態(tài)作用域
1.6.6 參數(shù)傳遞機制
1.6.7 別名
1.6.8 1.6節(jié)的練習
1.7 第1章的總結
1.8 第1章的參考書目
第2章 一個簡單的語法制導翻譯器
2.1 引言
2.2 語法定義
2.2.1 文法定義
2.2.2 推導
2.2.3 語法分析樹
2.2.4 二義性
2.2.5 運算符的結合性
2.2.6 運算符的優(yōu)先級
2.2.7 2.2節(jié)的練習
2.3 語法制導翻譯
2.3.1 后綴表示
2.3.2 綜合屬性
2.3.3 簡單語法制導定義
2.3.4 樹的遍歷
2.3.5 翻譯方案
2.3.6 2.3節(jié)的練習
2.4 語法分析
2.4.1 自頂向下分析方法
2.4.2 預測分析法
2.4.3 何時使用產(chǎn)生式
2.4.4 設計一個預測語法分析器
2.4.5 左遞歸
2.4.6 2.4節(jié)的練習
2.5 簡單表達式的翻譯器
2.5.1抽象語法和具體語法
2.5.2調(diào)整翻譯方案
2.5.3非終結符號的過程
2.5.4 翻譯器的簡化
2.5.5 完整的程序
2.6 詞法分析
2.6.1 剔除空白和注釋
2.6.2 預讀
2.6.3 常量
2.6.4 識別關鍵字和標識符
2.6.5 詞法分析器
2.6.6 2.6節(jié)的練習
2.7 符號表
2.7.1 為每個作用域設置一個符號表
2.7.2 符號表的使用
2.8 中間代碼生成
2.8.1 兩種中間表示形式
2.8.2 語法樹的構造
2.8.4 三地址碼
2.8.5 2.8節(jié)的練習
2.9 第2章的總結
第3章 詞法分析
3.1 詞法分析器的作用
3.1.1 詞法分析及解析
3.1.2 詞法單元、模式、詞素
3.1.3 詞法單元的屬性
3.1.4 詞法錯誤
3.1.5 3.1節(jié)的練習
3.2 輸入緩沖
3.2.1 緩沖區(qū)對
3.2.2 哨兵標記
3.3 詞法單元的規(guī)約
3.3.1 串和語言
3.3.2 語言上的運算
3.3.3 正則表達式
3.3.4 正則定義
3.3.5 正則表達式的擴展
3.3.6 3.3節(jié)的練習
3.4 詞法單元的識別
3.4.1 狀態(tài)轉換圖
3.4.2 保留字和標識符的識別
3.4.3 完成我們的連續(xù)性例子
3.4.4 基于狀態(tài)轉換圖的詞法分析器的體系結構
3.4.5 3.4節(jié)的練習
3.5 詞法分析器生成工具Lex
3.5.1 Lex的使用
3.5.2 Lex程序的結構
3.5.3 Lex中的沖突解決
3.5.4 向前看運算符
3.5.5 3.5節(jié)練習
3.6 有窮自動機
3.6.1 不確定的有窮自動機
3.6.2 轉換表
3.6.3 NFA接受輸入字符串
3.6.4 確定的有窮自動機
3.6.5 3.6節(jié)的練習
3.7 從正則表達式到自動機
3.7.1 從NFA到DFA的轉換
3.7.2 NFA的模擬
3.7.3 NFA模擬效率
3.7.4 從正則表達式構造NFA
3.7.5 字符串處理算法的效率
3.7.6 3.7節(jié)的練習
3.8 詞法分析器生成工具的設計
3.8.1 被生成的詞法分析器的結構
3.8.2 基于NFA的模式匹配
3.8.3 詞法分析器使用的DFA
3.8.4 實現(xiàn)向前看運算符
3.8.5 3.8的練習
3.9 基于DFA的模式匹配器的優(yōu)化
3.9.1 NFA的重要狀態(tài)
3.9.2 根據(jù)抽象語法樹計算得到的函數(shù)
3.9.3 計算nullable、firstpos及l(fā)astpos
3.9.4 計算followpos
3.9.5 根據(jù)正則表達式構建DFA
3.9.6 最小化一個DFA的狀態(tài)數(shù)
3.9.7 詞法分析器的狀態(tài)最小化
3.9.8 在DFA模擬中用時間換取空間
3.9.9 3.9節(jié)的練習
3.9.10 第3章的總結
3.11 第3章參考文獻
第4章 語法分析
4.1 引論
4.1.1 語法分析器的角色
4.1.2 代表性的文法
4.1.3 語法錯誤的處理
4.1.4 錯誤恢復策略
4.2 上下文無關文法
4.2.1 上下文無關文法的正式定義
4.2.2 符號表示的慣例
4.2.3 推導
4.2.4 語法分析樹和推導
4.2.5 二義性
4.2.6 驗證文法生成的語言
4.2.7上下文無關文法和正則表達式
4.2.8 4.2節(jié)的練習
4.3 設計文法
4.3.1 詞法分析和語法分析
4.3.2 消除二義性
4.3.3 左遞歸的消除
4.3.4 提取左公因子
4.3.5 非上下文無關的語言構造
4.3.6 4.3節(jié)的練習
4.4 自頂向下的語法分析
4.4.1 遞歸下降的語法分析
4.4.2 FIRST和FOLLOW
4.4.3 LL(1)文法
4.4.4 非遞歸的預測分析
4.4.5 預測分析中的錯誤恢復
4.4.6 4.4節(jié)的練習
4.5 自底向上的語法分析
4.5.1 歸約
4.5.2 句柄剪枝
4.5.3 移入-歸約語法分析技術
4.5.4 移入-歸約語法分析中的沖突
4.5.5 4.5節(jié)的練習
4.6 LR語法分析技術介紹:簡單LR技術
4.6.1 為什么使用LR語法分析器?
4.6.2 項和LR(0)自動機
4.6.3 LR-語法分析算法
4.6.4 構造SLR-分析表
4.6.5 可行前綴
4.6.6 4.6節(jié)的練習
4.7 更強大的LR語法分析器
4.7.1 規(guī)范LR(1)項
4.7.2 構造LR(1)項集
4.7.3 規(guī)范LR(1)分析表
4.7.4 構造LALR語法分析表
4.7.5 LALR語法分析表的高效構造方法
4.7.6 LR語法分析表的壓縮
4.7.7 4.7節(jié)的練習
4.8 使用二義性文法
4.8.1 用優(yōu)先級和結合性解決沖突
4.8.2 “懸空-else”二義性
4.8.3 LR語法分析中的錯誤恢復
4.8.4 4.8節(jié)的練習
4.9 語法分析器的生成工具
4.9.1 語法分析器的生成工具Yacc
4.9.2 使用Yacc處理二義性文法
4.9.3 用Lex創(chuàng)建Yacc的詞法分析器
4.9.4 Yacc中的錯誤恢復
4.9.5 4.9節(jié)的練習
4.10:第4章的小結
4.11 第4章的參考文獻
第5章 語法制導的翻譯
5.1 語法制導定義
5.1.1 繼承屬性和綜合屬性
5.1.2 在一棵語法分析樹的結點上對一個SDD求值
5.1.3 5.1節(jié)的練習
5.2 SDD的求值順序
5.2.1 依賴圖
5.2.2 屬性求值的順序
5.2.3 S-屬性定義
5.2.4 L-屬性定義
5.2.5 具有受控副作用的語義規(guī)則
5.2.6 5.2節(jié)的練習
5.3 語法制導翻譯的應用
5.3.1 抽象語法樹的構造
5.3.2 類型的結構
5.3.3 5.3節(jié)的練習
5.4 語法制導的翻譯方案
5.4.1 后綴翻譯方案
5.4.2 后綴SDT的語法分析棧實現(xiàn)
5.4.3 產(chǎn)生式內(nèi)部帶有語義動作的SDT
5.4.4 從SDT中消除左遞歸
5.4.5 L-屬性定義的SDT
5.4.6 5.4節(jié)的練習
5.5 實現(xiàn)L-屬性的SDD
5.5.1 在遞歸下降語法分析過程中進行翻譯
5.5.2 邊掃描邊生成代碼
5.5.3 L-屬性的SDD和LL語法分析
5.5.4 L-屬性的SDD的自底向上語法分析
5.5.5 5.5節(jié)的練習
5.6 第5章的總結
5.7 第5章的參考文獻
第6章 中間代碼生成
第7章 運行時刻環(huán)境
第7章 總結
第8章 代碼生成
第9章 機器無關優(yōu)化
第10章 指令級并行
第11章 并行性和局部性的優(yōu)化
第12章 過程間分析
第4章 語法分析
4.1 引論
在本節(jié)中,我們將考察語法分析器是按照什么方法被集成到一個典型的編譯器中的。然后我們將研究算術表達式的典型文法。表達式文法已經(jīng)足以演示語法分析的本質,因為處理表達式的語法分析技術可以被用于處理程序設計語言的大部分構造。這一節(jié)的最后討論了錯誤處理的問題,因為當語法分析程序發(fā)現(xiàn)它的輸入不能由它的文法生成時,它必須作出得體的反應。
4.1.1 語法分析器的角色
在我們的編譯器模型中,語法分析器從詞法分析器獲得一個由詞法單元組成的串,并驗證這個串可以由源語言的文法生成,如圖4.1所示。我們期望語法分析器能夠以易于理解的方式報告語法錯誤,并且能夠從常見的錯誤中恢復并繼續(xù)處理程序的其余部分。從概念上講,對于良構的程序,語法分析器構造出一棵語法分析樹,并把它傳遞給編譯器的其余部分進一步處理。實際上并不需要顯式地構造出這棵語法分析樹,因為正如我們將看到的,對源程序的檢查和翻譯處理可以和語法分析過程交錯完成。因此,語法分析器和前端的其它部分可以用一個模塊來實現(xiàn)。
……