編譯原理 總結

2021-08-13 13:17:58 字數 4015 閱讀 4273

一、 編譯程式

1、 編譯器是一種翻譯程式,它用於將源語言(即用某種程式語言寫成的)程式翻譯為目標語言(即用二進位制數表示的偽機器**寫成的)程式。後者在windows作業系統平台下,其檔案的副檔名通常為.obj。該檔案通常還要經過進一步的連線,生成可執行檔案(機器**寫成的程式,擴充套件名為.exe)。通常有兩種方式進行這種翻譯,一種是編譯,另一種是解釋。後者並不生成可執行檔案,只是翻譯一條語句、執行一條語句。這兩種方式相編譯比解釋執行的速度要快得多。

2、 編譯過程的5個階段:詞法分析;語法分析;語義分析與中間**產生;優化;目標**生成。

3、 在這五個階段中,詞法分析的任務是識別源程式中的單詞是否有誤,編譯程式中實現這種功能的部分一般稱為詞法分析器。在編譯器中,詞法分析器通常僅作為語法分析程式的乙個子程式以便在它需要單詞符號時呼叫。在這一編譯階段中發現的源程式錯誤,稱為詞法錯誤。

4、 語法分析階段的目的是識別出源程式的語法結構(即語句或句子)是否錯誤,所以有時又常為句子分析。編譯程式中負責這一功能的程式稱為語法分析器或語法分析程式。在這一階段中發現的錯誤稱為語法錯誤。

5、 c語言的(源)程式必須經過編譯才能生成目標**,再經過鏈結才能執行。pascal語言、fortran語言的源程式也要經過這樣的過程。通常將c、pascal、fortran這樣的語言統稱為高階語言。而將最終的可執行程式稱為機器語言程式。

6、 在編譯c語言程式的過程中,發現源程式中的乙個識別符號過長,超過了編譯程式允許的範圍,這個錯誤應在詞法分析階段發現,這種錯誤通常被稱作詞法錯誤。

 詞法分析器的任務是以詞法規則為依據對輸入的源程式進行單詞及其屬性的識別,識別出乙個個單詞符號。

 詞法分析的輸入是源程式,輸出是乙個個單詞的特殊符號,稱為token(標記或符號)。

 語法分析器的型別有:自下而上、自上而下。常用的語法分析器有:遞迴下降分析方法是一種自上而下分析方法, 算符優先分析法屬於自下而上分析方法,lr分析法屬於自下而上分析方法等等。

 通常用正規文法或正規式來描述程式語言的詞法規則,而使用上下文無關文法來描述程式語言的語法規則。

 語法分析階段中,處理的輸入資料是來自詞法分析階段的單詞符號。它們是詞法分析階段的終結符。

7、 編譯程式總框

8、 在計算機發展的早期階段,記憶體較小的不能一次完成程式的編譯。這時通常將編譯過程分成若干遍來完成。每一遍完成一部分功能,稱為多遍編譯。

與採用高階程式語言寫的詞法分析器相比,用組合語言寫的詞法分析通常分析速度要快些。

二. 詞法與語法

1、 程式語言主要由語法和語義兩個方面來定義。

2、 任何語言的程式都可看成是某字符集上的乙個長字串。

3、 語言的語法:是指這樣的一組規則(即產生式),用它可以生成和產生乙個良定的程式。這些規則的一部分稱為詞法規則,另一部分稱為語法規則。

4、 詞法規則:單詞符號的形成規則;語法規則:語法單位(句子)的形成規則。語義規則:定義程式句子的意義。

5、 乙個程式語言的基本功能是描述資料和對資料的運算。

6、 高階語言的分類:強制式語言;應用式語言;基於規則的語言;物件導向的語言。

7、 乙個語言的字母表為,則字串ab的字首有a、ε,其中ε不是真字首。

8、 字串的連線運算一般不滿足交換率。

9、 文法g是乙個四元組,或者說由四個元素構成,即非終結符集合vn、非終結符號集合vt 、開始符號s、產生式集合p,它可以形式化地表示成g =(vn,vt,s,p)。

按照文法的定義,這4個元素中終結符號集合是這個文法所規定的語言的字母表,產生式集合代表文法所規定的語言語法實體的集合。對上下文無關文法,通常我們只需要寫出這個文法的產生式集合就可以確定這個文法的其他所有元素。其中,第一條產生式的左部符號為開始符號,而所有產生式的左部符號構成的集合就是該文法的非終結符集合。

 文法的例子:

設文法g=(vn,vt, s,p),其中p為產生式集合,它的每個元素的形式為產生式。

10、如果文法g的乙個句子存在兩棵不同的最左語法分析樹,則這個文法是無二義的。

11、如果文法g的乙個句子存在兩棵不同的最右語法分析樹,則這個文法是無二義的。

12、如果文法g的乙個句子存在兩棵不同的語法分析樹,則這個文法是無法判斷是否是二義的。

13、a為非終結符,如果文法存在產生式 ,則稱 可以推導出 ;反之,稱 可歸約為 。

14、喬姆斯基(chomsky)將文法分為四類,即0型文法、1文法、2文法、3文法。

按照喬姆斯基對方法的分類,上下文無關文法是2型文法,2型文法的描述能力最強,3型文法又稱為正規文法。

15、產生式s→sa | a產生的語言為l(g) = 。

16、確定有限自動機dfa是非確定有限自動機nfa的特例;對任一非確定有限自動機能找到乙個與之等價的確定有限自動機。

17、dfa和nfa的主要區別有三點:一、dfa初態唯一,nfa初態不唯一;二、dfa弧標記為σ上的元素,nfa弧標記為σ*上的元素;三、dfa的函式為單射,nfa函式不是單射。

18、有限自動機中兩個狀態s1和s2是等價的是指,無論是從s1還是s2出發,停於終態時,所識別的輸入字的集合相同。

19、自下而上的分析方法,是乙個不斷歸約的過程。

20、遞迴下降分析器:當乙個文法滿足ll(1)條件時,我們就可以為它構造乙個不帶回溯的自上而下分析程式。這個分析程式是由一組遞迴過程組成的,每個過程對應文法的乙個非終結符。

這個產生式中含有的左遞迴是直接左遞迴。遞迴下降分析法中,必須要消除所有的左遞迴。遞迴下降分析法中的試探分析法之所以要不斷用乙個產生式的多個候選式進行逐個試探,最根本的原因是這些候選式有公共左因子。

21、算符優先分析法是一種自下而上的分析方法,它適合分析各種程式設計語中的表示式,並宜於手工實現。目前最廣泛的無回溯的「移進—歸約」方法是自下而上分析方法。

22、在表驅動**分析器中,

1)讀入乙個終結符a,若該終結符與棧項的終結符相同,並且不是結束標誌$,則此時棧頂符號出棧;

2)若此時棧項符號是終結符並且是,並

且讀入的

終結符不

是 ,說明源程式有語法錯誤;

3)若此時棧頂符號為,並

且讀入的

終結符也

是 ,則分析成功。

23、算符優先分析方法不存在使用形如 這樣的產生式進行的歸約,即只要求終結符的位置與產生式結構一致,從而使得分析速度比lr分析法更快。

24、lr(0)的例子:

產生式e→ e+t對應的lr(0)專案中,待歸約的專案是e→ e+∙t,移進專案是e→ e∙+t,還有兩個專案為e→ ∙e+t和e→ e+t∙。

當乙個lr(0)專案集中含有兩個歸約專案時,稱這個專案集中含有歸約-歸約衝突。

25、ll(1)文法的產生式中一定沒有公共左因子,即ll(1)文法中一定沒有左遞迴。為了避免回溯,在ll(1)文法的**分析表中,乙個表項中至多只有乙個產生式。

**分析方法(即ll(1)方法),由乙個棧,乙個總控程式和乙個**分析表組成。其中構造出**分析表是該分析方法的關鍵。

26、lr(0)與slr(1)兩種分析方法相比,slr(1)的能力更強。

27、靜態語義檢查一般包括以下四個部分,即型別檢查、控制流檢查、名字匹配檢查、一致性檢查。

c語言編譯過程中下述常見的錯誤都屬於檢查的範圍:

a) 將字元型指標的值賦給結構體型別的指標變數:型別檢查。

b)switch語句中,有兩個case語句中出現了相同的常量:一致性檢查。

c)break語句在既不是迴圈體內、又不是break語句出現的地方出現:控制流檢查。

d)goto語句中的標號在程式的函式中沒有找到:一致性檢查。

e)同乙個列舉常量出現在兩個列舉型別的定義當中:相關名字檢查。

28、迴圈優化中**外提是指對迴圈中的有些**,如果它產生的結果在迴圈過程中是不變的,就把它提到迴圈體外來;而強度削弱是指把程式中執行時間較長的運算替換為執行時間較短的運算。 (完)

編譯原理 總結

一 編譯程式 1 編譯器是一種翻譯程式,它用於將源語言 即用某種程式語言寫成的 程式翻譯為目標語言 即用二進位制數表示的偽機器 寫成的 程式。後者在windows作業系統平台下,其檔案的副檔名通常為.obj。該檔案通常還要經過進一步的連線,生成可執行檔案 機器 寫成的程式,擴充套件名為.exe 通常...

編譯原理總結

從左至右掃瞄字串行,識別出單詞 關鍵字 標示符 常數 特殊符號 按照語言語法的規則,將詞法分析所得的單詞分解為各個語法成分。分析單詞串是否構成短語和句子 源程式進行上下文有關性質的檢查,看源程式有無語義錯誤。例如 變數是否定義 型別是否正確 含義明確 便於處理的記號系統。這種記號系統於源程式和機器語...

編譯原理總結

學了一學期的編譯原理,一開始上課的時候,感覺老師嘴裡的概念明明說的那麼順溜,可是到自己這就卡殼了,讓我想起了乙個梗 要考試了,在複習的時候,開啟書,馬冬梅,恩記住了,合上書,什麼冬梅?開啟書,馬冬梅,合上書,馬什麼梅?歸結起來就是書看的少。複習的時候課件認認真真的看了兩遍,現在來梳理一下這門課。上邊...