一、編譯器概述
1、名詞解釋
1.1解釋下列名詞
源語言:被翻譯器翻譯的語言,用於書寫源程序的語言。
目標語言:被翻譯器翻譯之后得到的語言,用於書寫目標程序的語言
翻譯器:能夠完成從一種語言到另一種語言的變換的軟件
編譯器:一種特殊的翻譯器,要求目標語言比源語言低級
解釋器:解釋器是不同於編譯器的另一種語言處理器。解釋器不像編譯器那樣通過翻譯來生成目標程序,而是直接執行源程序所指定的運算。
2、編譯階段
1.2典型的編譯器可以划分成幾個主要的邏輯階段?各階段的主要功能是什么?
典型的編譯器可以划分成七個主要的邏輯階段,分別是詞法分析器、語法分析器、語義分析器、中間代碼生成器、獨立於機器的代碼優化器、代碼生成器、依賴於機器的代碼優化器。各階段的主要功能:
(1)詞法分析器:詞法分析閱讀構成源程序的字符流,按編程語言的詞法規則把它們組成詞法記號流。
(2)語法分析器:按編程語言的語法規則檢查詞法分析輸出的記號流是否符合這些規則,並依據這些規則所體現出的該語言的各種語言構造的層次性,用各記號的第一元建成一種樹形的中間表示,這個中間表示用抽象語法的方式描繪了該記號流的語法情況。
(3)語義分析器:使用語法樹和符號表中的信息,依據語言定義來檢查源程序的語義一致性,以保證程序各部分能有意義地結合在一起。它還收集類型信息,把它們保存在符號表或語法樹中。
(4)中間代碼生成器:為源程序產生更低級的顯示中間表示,可以認為這種中間表示是一種抽象機的程序。
(5)獨立於機器的代碼優化器:試圖改進中間代碼,以便產生較好的目標代碼。通常,較好是指執行較快,但也可能是其他目標,如目標代碼較短或目標代碼執行時能耗較低。
(6)代碼生成器:取源程序的一種中間表示作為輸入並把它映射到一種目標語言。如果目標語言是機器代碼,則需要為源程序所用的變量選擇寄存器或內存單元,然后把中間指令序列翻譯為完成同樣任務的機器指令序列。
(7)依賴於機器的代碼優化器:試圖改進目標機器代碼,以便產生較好的目標機器代碼。
3、有限自動機
有限怎么理解?
DFA和NAF區別?
二、詞法分析
1、正規式
例1
例2
至少含有一個1,因而需要正閉包1+,在出現1后面就會對其后是1還是0選擇狀態,如果是1,則停留在q2狀態上,如果是0進入q3狀態。在q3狀態上,如果選擇0進入q2狀態,則實現了1后面兩個0,如果是選擇1進行q2狀態,后面沒有0,同樣也是符合1后面偶數個0的,這樣q2與q3本質是一種等價狀態。
例3
換個意思理解,就是任何一個1后面都有偶數個0
例4
解釋:對於L來說描述的語言意思是0的個數是偶數並且1的個數是偶數,原因在於11、00必然是0偶1偶,而01、10要至少出現兩次無論是0101,1010,0110,1001都能保證0偶1偶
對於L1
對於L2
對於L3
L2的另外一種表達形式
習題2.3
敘述下列正規式描述的語言
a) 0(0|1)*0
b) ((ε|0)1*)*
c) (0|1)*0(0|1)(0|1)
d) 0*10*10*10*
e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)*
答案:
a)以0開始和結尾,而且長度大於等於2的0、1串
b)所有0,1串(含空串)
c)倒數第三位是0的0、1串
d) 僅含3個1的0、1串
e) 偶數個0和偶數個1的0、1串(含空串)
2、有限自動機
NFA:不確定的有限自動機
DFA:確定的有限自動機
例1
例2
還能表示的正規式是(b*a+b)+
例題3
例題4
習題2.7
用算法2.4為下列正規式構造非確定的有限自動機,給出它們處理輸入串ababbab的轉換序列。
a) (a|b)*
b) (a*|b*)*
c)((ε|a)b*)*
d)(a|b)*abb(a|b)*
答案:
a) (a|b)*
輸入串ababbab 的轉換序列:
0 1236 1456 1236 1456 1456 1236 14567
b) (a*|b*)*
輸入串ababbab 的轉換序列:
0 1234510 1678910 1234510 167878910 12345610 167891011
c)((ε|a)b*)*
輸入串ababbab 的轉換序列:
0 1456789 145678 789 1456789 10
D)NAF:
輸入串ababbab 的轉換序列:
0 1236 1456 789 10 11 12 13 16 11 14 15 16 17
習題2.11
對於(a|b)*使用子集構造法
原NFA:
A:{0、1、2、4、7}
B:{1、2、3、4、6、7} A+a
C:{1、2、4、5、6、7} A+b
對於(a*|b*)*使用子集構造法
原NFA:
A:{0、1、2、3、5、6、7、9、10、11}
B:{1、2、3、4、6、7、9、10、11} A+a
C:{1、2、5、6、7、8、9、10、11} A+b
對於((ε|a)b*)*使用子集構造法
原NFA:
A:{0、1、2、3、4、6、7、9、10}
B:{1、2、3、4、5、6、7、9、10} A+a
C:{1、2、3、4、6、7、8、9、10} A+b
三者DFA相同
化成最簡DFA
習題2.13
習題2.14
有點像小丑的微笑?
三、語法分析
1、分析樹
習題3.1
對句子(a,(a,a))的最左推導,最右推導和分析樹。
對句子(a,((a , a),(a , a) ) )的最左推導,最右推導和分析樹。
該文法產生的語言是:括號匹配的串,串中的各項由“,”隔開,項可以是括號匹配的子串或a。
習題3.2
3.2 考慮文法 S aSbS | bSaS |ε
(a) 為句abab 構造兩個不同的子最左推導,以此說明該文法是二義的。
(b) 為abab 構造對應的最右推導。
(c) 為abab 構造對應的分析樹。
(d) 這個文法產生的語言是什么?
二義性出現在第二步上,是將最左邊的S換成ε還是換成aSbS?
最右推導也是二義的。
該文法產生的語言是:該文法產生a、b個數相等的ab串(含空串)
習題3.3
2、二義性
3、直接左遞歸的消除
舉例:
3、LL(1)文法
FRIST集
FOLLOW集
SELECT集
習題3.8
S->(L)|a
L->SL’
L’->,SL’|e
SELECT集
SELECT(S){ (, a}
對於S->(L) 右部以終結符(打頭
對於S->a右部以終結符a打頭
SELECT(L){ ( ,a }
對於L->SL’ 右部第一個非終結符S的FIRST集
SELECT(L'){ ' , ' , ) , $ , ' , ' }
對於L’->,SL’ 右部以終結符‘ , ’打頭
對於L’->e SELECT集就是左部的FOLLOW集
習題3.10
4、自下而上分析
句柄是該句型中和一個產生式右部匹配的子串
習題3.16
(a)用習題3.1的文法構造(a,(a,a))的最右推導,說出每個右句型的句柄。
(b)給出對應的(a)的最右推導的移進-歸約分析器的步驟。
(c)對照(b)的移進-歸約,給出自下而上構造分析樹的步驟。
5、LR文法
習題3.17
四、語法指導的翻譯
習題4.3
習題4.6
習題4.12
習題4.14
習題4.15