編譯原理-學習框架(精品)

本文章參考教材張素琴版編譯原理(清華大學出版社)編寫,希望對大家的複習和學習有更好的整體上的把握。


何爲編譯原理?


我們可以想象,相信大家都有過一定的編程經歷,我們可以類比我們最熟知的C++編程的過程。

即最初的代碼(文法),代碼進行初步編譯(語法分析),若程序無語法問題,程序是可以直接運行的,編譯器不會報錯,

但這是初步的學習,我們進入更高層編程的層次就要求我們要對代碼進行進一步的修改(中間代碼的生成),最後我們將所得到的代碼進行最終的優化(代碼的優化)過程。

所以在學習這門課程的時候我們首先要樹立這樣的一個思維框架,才能在學習的過程中學而不亂,有條不紊。


下面說一下具體的核心知識:


對於第一章和第三章即是一些概念性的知識點,但是大家也要格外注意一些基本的概念上的細節,考試的選擇和填空題目一般以這兩章的知識爲主。


(下面一些基本概念性的東西大家在書上找一下即可,概念很重要!!!千萬不要忽視這一點)


第一章引論:主要講述了編譯程序的結構工具一類,這個大家閱讀一下即可,作爲基本的瞭解。


第三章文法和語言:這一章介紹了編譯原理這門課最基礎也是最核心的知識點,一定要牢牢把握文法,句子,句型,語言,短語,句柄(最左的直接短語,句柄這裏要格外理解),直接短語等這些基本的概念以及相互之間的關聯,一定要搞清楚。


前三章的內容即是代碼的初步編寫的過程,接下來我們的工作是要對代碼進行相應的分析。


第四章 詞法分析:


第四章,我們要區分好DFA M(確定性的)和NFA M(不確定性的)這兩個自動機。


重點的考點在NFA的構造,DFA的構造,以及NFA和DFA之間的轉化,正規文法,正規式的概念,DFA的化簡(需要說明的是一定是DFA進行化簡,確定性的事物才值得我們去做接下來的工作,所以書上沒有說NFA的化簡,這裏大家注意一下即可)。


我相信大家看到這裏肯定有同學會有這樣的疑問:1.學完了之後不知道這兩個自動機是做什麼的?2.爲什麼要進行相互之間的轉化?3.難道不可以將DFA轉化成NFA嗎,爲什麼一定是反過來?


下面的解釋希望對大家有一些啓發:我們想象在我們一開始編寫程序的時候一定是一段不確定的代碼程序,因爲我們不能預料其結果。所以現在程序狀態一定是不確定的,不能是確定性的,要是確定的話就直接爲DFA(我們暫且可以顧名思義)。所以我們要進行進一步的優化,讓程序可執行即確定化的過程(NFA->DFA)。不知道這樣的解釋大家有沒有一些領悟。


考試的常考點:①NFA的構造②NFA如何轉化爲DFA③DFA的最小化(子集法)見教科書P61,適當做一下課後的練習1,7,8三道題以鞏固知識點。

課後練習:1,3。


第四章結束。


第五章 詞法分析:

學到這裏想必大家已經對語法有了更加深刻的認識,下面書上介紹兩種語法分析方法(自頂向下和自底向上)(ps:我一開始學習的時候總是和OSI的自頂向下的七層模型搞到一起╮( ̄▽ ̄")╭,不知道大家有木有這樣的體驗)


引用書上的一句話,語法分析是編譯程序的核心部分(鄙人認爲是最核心的,因爲考試涉及最多,你說捏~)


簡單來說:

自頂向下的分析即給出產生式從樹根(一般是S開頭)向下發展子女,形成一顆生成樹,最終可以得到輸入串,從而進行判別。

自底向上的分析則是移近-規約的過程是自頂向下最右推到的逆過程,這裏應該不難理解(大傢俱體看書體會一下,先把這些概念搞清楚,有一個大體的把握)。


我們先說自頂向上的分析:說明一下,大家會想到是不是像自動機一樣,這裏也會有確定的和不確定的呢,答案是肯定的,通過看書大家會發現,書上大部分的章節是講述的是確定的文法分析。不確定的情況大家作爲了解。

在這裏有一個很重要的文法類型就是LL(1)型文法,要重點掌握LL(1)型文法的判別規則,First集,Follow集,Select集的具體求法(注意有空產生式和非空產生式求發上是不同的),非LL(1)文法和LL(1)文法之間的相互轉換的過程。


這裏爲什麼會存在非LL(1)文法,是因爲如果產生式中存在有直接和間接左遞歸,含有左公共因子的情況都是不滿足LL(1)文法的條件,所以我們需要將其轉化爲LL(1)文法近一步分析。大體的知識點就這麼多,大家要對這一章要重視,因爲後面的會在這個基礎上逐漸加深難度。


第六章 自底向上的優先分析:


這一章和下面的一章第七章的內容是考試最爲熱門的考點,大題集中在這兩章,希望大家注意上課的時候一定一定一定不能走神!(醜話說在前面,如果不,到時候你的複習會十分難過)。


第六章介紹了兩種自底向上的分析方法:①簡單優先分析法②算符優先分析法


大家的學習和複習的重點放第二種分析法,第一種到後來你會發現,其實瞭解概念就可以了。


算符優先文法學習和複習時一定要格外留意:①算符的優先關係的求解(.>,<.,=)②優先關係表的繪製(這都是很關鍵的前提,直接關係到後面的結果,馬虎不得)。

優先函數的確定(這裏是比較難懂的地方,當初學習的時候在這裏溜號,回去花了一天的時間沒搞懂,也可能是智商的問題。)


優先函數的確定有兩種方法一般建議用第二種(優先函數關係圖):雖然略麻煩,但比較直觀,容易上手。大家對這裏的學習要格外注意哦!


第六章結束。

第七章 LR分析:


第七章的內容相比第六章的內容,內容更加豐富,知識面更廣,覆蓋面更多。所以大家要不斷鞏固這裏的知識。

本章介紹了四種LR分析的方法:LR(0),SLR(1),LALR(1),LR(1)(注,這是按照文法的限制程度,從左到右適用性即限制性依次降低)。


何爲LR分析法


LR分析法是一種自下而上進行規範歸約的語法分析法,L指從左到右掃描輸入符號串,R是指構造最右推導的逆過程。LR(1)中的1是每次搜索符號需要向前參考一步,即參考下一個符號確定當前構造。(說的直白一點,就是自底向上的分析方法,對輸入串進行移進規約的操作,這個大家到後期學習會領悟到~)


LR分析的核心是構造項目集規範族(書P130開始)。


LR(0)是四種分析中最爲簡單的一種,因爲簡單,所以對文法的要求很高,限制性很強,若產生移近-規約,規約-規約衝突的情況,用此分析方法是無法進行解決的。

所以此時我們引入了SLR(1)文法來進行解決,這個方法可以解決大部分的衝突,但有些衝突仍然是無法解決的,這時我們需要掌握適用性最強的LR(1)文法(這裏的LALR(1)文法其實就是簡化了的LR(1)文法,也就是引入了一個同心集的概念)。無論是上述的哪種分析方法,項目集規範族的正確書寫是解決問題的關鍵所在,所以大家在這裏要多下功夫,多做一些課後習題。


第七章結束。


第八章 語法制導翻譯和中間代碼生成:


這一章說實在是最讓人頭疼的一章,因爲很多老師在這一章會卡住,他們也講得很含糊。但是我們還是要理解並掌握。

概念性的知識:①屬性文法②語義規則③S型和L型屬性文法的區別(大家一定要結合書上的例題來看,光看概念收效甚微)

④中間代碼的表示:

1.逆波蘭式(考試重點)

2.三元式和樹形表示

3.四元式

(以上的三種表示形式也有可能在填空題裏出現哈,大家留意一下)


(ps:後面的章節由於時間關係老師就沒有講,如果有學到的同學記得分享一下哈,在這裏我就不過多講解了)


第八章結束。


第十一章 代碼的優化:


重點是在第二小結,局部優化,包括對基本塊的理解,DAG圖的應用,都是考試的必考點。(其他的話大家自己看一下就好。PS:強行解釋)


第十一章結束。


不知看到這裏的你是否對這門課程有了一點清楚的認知呢,學習的道路還很漫長,你我共同努力~。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章