編譯原理期末複習資料

  • Chomsky把文法分爲幾種類型?什麼是文法的二義性?

喬姆斯基把文法法分成四種類型,即0型、1型、2型和3型。這幾種文法類型的概念一定要掌握,是一個非常重要的考點。對於這幾種文法,一般書上都只有簡單的概念介紹,比較抽象,所以很多學員都沒有真正理解。下面我將把概念結合例題進行講解。

  0型文法

  設G=(VN,VT,P,S),如果它的每個產生式α→β是這樣一種結構:α∈(VN∪VT)*且至少含有一個非終結符,而 β∈(VN∪VT)*,則G是一個0型文法。0型文法也稱短語文法。一個非常重要的理論結果是:0型文法的能力相當於圖靈機(Turing)。或者說,任 何0型文語言都是遞歸可枚舉的,反之,遞歸可枚舉集必定是一個0型語言。0型文法是這幾類文法中,限制最少的一個,所以我們在試題中見到的,至少是0型文 法。

  1型文法

  1型文法也叫上下文有關文法,此文法對應於線性有界自動機。它是在0型文法的基礎上每一個α→β,都有|β|>=|α|。這裏的|β|表示的是β的長度。

  注意:雖然要求|β|>=|α|,但有一特例:α→ε也滿足1型文法。

  如有A->Ba則|β|=2,|α|=1符合1型文法要求。反之,如aA->a,則不符合1型文法。

  2型文法

  2型文法也叫上下文無關文法,它對應於下推自動機。2型文法是在1型文法的基礎上,再滿足:每一個α→β都有α是非終結符。如A->Ba,符合2型文法要求。

  如Ab->Bab雖然符合1型文法要求,但不符合2型文法要求,因爲其α=Ab,而Ab不是一個非終結符。

  3型文法

  3型文法也叫正規文法,它對應於有限狀態自動機。它是在2型文法的基礎上滿足:A→α|αB(右線性)或A→α|Bα(左線性)。

  如有:A->a,A->aB,B->a,B->cB,則符合3型文法的要求。但如果推導 爲:A->ab,A->aB,B->a,B->cB或推導 爲:A->a,A->Ba,B->a,B->cB則不符合3型方法的要求了。具體的說,例子 A->ab,A->aB,B->a,B->cB中的A->ab不符合3型文法的定義,如果把後面的ab,改成“一個非終結 符+一個終結符”的形式(即爲aB)就對了。例子A->a,A->Ba,B->a,B->cB中如果把B->cB改爲 B->Bc的形式就對了,因爲A→α|αB(右線性)和A→α|Bα(左線性)兩套規則不能同時出現在一個語法中,只能完全滿足其中的一個,才能算 3型文法。

 注意:上面例子中的大寫字母表示的是非終結符,而小寫字母表示的是終結符。

如果文法G中的某個句子存在不只一棵語法樹,則稱該句子是二義性的。如果文法含有二義性的句子,則稱該文法是二義性的。

 

  • 簡述DFA與NFA的區別。

1. DFA對於文本串裏的每一個字符只需掃描一次,比較快,但特性較少;NFA要翻來覆去吃字符、吐字符,速度慢,但是特性豐富,所以反而應用廣泛,當今主要的正則表達式引擎,如Perl、Ruby、Python的re模塊、Java和.NET的regex庫,都是NFA的。
2. 只有NFA才支持lazy和backreference等特性;
3. NFA急於邀功請賞,所以最左子正則式優先匹配成功,因此偶爾會錯過最佳匹配結果;DFA則是“最長的左子正則式優先匹配成功”。
4. NFA缺省採用greedy量詞(見item 4);
5. NFA可能會陷入遞歸調用的陷阱而表現得性能極差。

兩種引擎的工作方式完全不同,一個(NFA)以表達式爲主導,一個(DFA)以文本爲主導!一般而論,DFA引擎則搜索更快一些!但是NFA以表達式爲主導,反而更容易操縱,因此一般程序員更偏愛NFA引擎!

  • 什麼是算符文法?並舉例說明。

一個文法,如果他的任何一個產生式的右部都不包含連個連續的非終結符,那麼則稱之爲算符文法,比如說加減乘除都是算符文法。

算符優先文法是一種自下而上的分析方法,其文法的特點是文法的產生式中不含兩個相鄰的非終結符。自上而下的分析方法,通常要求文法的產生式不含左遞歸,如LL(I)文法就是一種可以自上而下分析的文法。

定義: 

假定G是不含ε- 產生式的算符文法。對於任何一對終結符a、b,我們說:

(1)a等於b 當且僅當文法G中含有形如P→ ···ab···或P→···aQb···的產生式;

(2)a小於b 當且僅當G中含有形如P→···aR···的產生式,而R(+=>)b···或R(+=>)Qb···;

(3)a大於b 當且僅當G中含有形如P→···Rb···的產生式,而R(+=>)···a或R(+=>)···aQ;

如果一個算符文法G中的任何終結符對(a,b)最多滿足下述三個條件之一:

a=b,a<b,a>b

則稱G是一個算符優先文法。

 

  • 什麼是3型文法?什麼是文法的語言?

一個形式文法G是下述元素構成的一個四元組N, Σ, PS):

  • 非終結符號集合N
  • 終結符號集合Σ,Σ與N無交。
  • 取如下形式的一組“產生式規則” P

(Σ ∪ N)*中的字符串→ (Σ ∪ N)* 中的字符串(這裏的*是克萊尼星號),並且產生式左側的字符串中必須至少包括一個非終結符號。

  • 起始符號SS屬於N

一個由形式文法G = (N, Σ, PS)產生的語言是所有如下形式的字符串集合,這些字符串全部由“終結符號”集Σ中符號構成,並且可以從“初始符號”S出發,不斷應用P中的“產生式規則”而得到。

  • 什麼是文法的二義性?給出一個二義性文法實例。

如果文法G中的某個句子存在不只一棵語法樹,則稱該句子是二義性的(文法如果有兩個不同的最右(最左)推導)。如果文法含有二義性的句子,則稱該文法是二義性的。提出一些限制條件,稱爲無二義性的充分條件,當文法滿足這些條件時,就可以判定文法是無二義性的. 確定一種編譯算法,使該算法滿足無二義性充分條件.”

class  Timer  {

 public

  Timer ();

};

 

class  TimeKeeper  {

 public

  TimeKeeper const  Timer t );

 

  int  get_time ();

};

 

int  main () {

  TimeKeeper  time_keeper (Timer ());

  return  time_keeper 。get_time ();

}

TimeKeeper  time_keeper (Timer ());

看起來很模糊,因爲它可以被解釋爲

  1. 一個變量爲變量定義time_keeper的類的TimeKeeper,具有類的一個匿名實例來初始化Timer
  2. 一個函數聲明爲函數time_keeper返回類型的對象TimeKeeper,並且具有單一的(未命名)參數是函數返回類型的指針Timer(並考慮無輸入)。

大多數程序員都期望第一個,但C ++標準要求將其解釋爲第二個。

 

  • 用實例說明簡單棧式存儲分配的過程。

有些語言使用過程、函數或方法作爲用戶自定義動作的單元,幾乎所有針對這些語言的編譯器都把它們的(至少一部分的)運行時刻存儲以棧的形式進行管理,稱爲棧式存儲分配

  • 當一個過程被調用時,該過程的活動記錄被壓入棧;當過程結束時,該活動記錄被彈出
  • 這種安排不僅允許活躍時段不交疊的多個過程調用之間共享空間,而且允許以如下方式爲一個過程編譯代碼:它的非局部變量的相對地址總是固定的,和過程調用序列無關

3.1 活動樹

用來描述程序運行期間控制進入和離開各個活動的情況的樹稱爲活動樹

  • 樹中的每個結點對應於一個活動根結點是啓動程序執行的main過程的活動
  • 在表示過程p的某個活動的結點上,其子結點對應於被p的這次活動調用的各個過程的活動。按照這些活動被調用的順序,自左向右地顯示它們。一個子結點必須在其右兄弟結點的活動開始之前結束。

控制棧

  • 每個活躍的活動都有一個位於控制棧中的活動記錄
  • 活動樹的的活動記錄位於棧底
  • 程序控制所在的活動的記錄(即當前活動)位於棧頂
  • 棧中全部活動記錄的序列對應於在活動樹中到達當前控制所在的活動結點的路徑

3.2 設計活動記錄的一些原則

在調用者和被調用者之間傳遞的值一般被放在被調用者的活動記錄的開始位置,這樣它們可以儘可能地靠近調用者的活動記錄

固定長度的項被放置在中間位置:控制連、訪問鏈、機器狀態字

在早期不知道大小的項被放置在活動記錄的尾部

棧頂指針寄存器top_sp指向活動記錄中局部數據開始的位置,以該位置作爲基地址

 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 常見的代碼優化技術有哪些?依據優化所涉及的範圍分爲那些級別?

刪除多餘運算、代碼外提、強度削弱、變換控制條件、合併已知量和複寫傳播、刪除無用賦值。局部優化、循環優化、全局優化。

  • 簡述符號表的總體組織方法。

 第一種:把屬性種類完全相同的那些符號組織在一起,構造出表項是分別爲等長的多個符號表。這樣組織的最大優點是每個符號表的屬性個數和結構完全相同。

第二種:把所有語言中的符號都組織在一張符號表中。組成一張包括了所有屬性的龐大的符號表。這樣組織方式的最大優點是總體管理非常集中單一,且不同種類符號的共同屬性可一致地管理和處理。

第三種:折衷方式是根據符號屬性相似程度分類組織成若干張表,每張表中記錄的符號都有比較多的相同屬性。這種折衷的組織方式在管理複雜性及時空效率方面都取得折衷的效果,並且對複雜性和效率的取捨可由設計者根據自己的經驗和要求及目標系統的客觀環境和需求進行選擇和調整。

 

  • 構造一上下文無關文法,使其描述的語言L(G)是能被5整除的無符號整數集合(允許0打頭)。

G[S]:

S → N0 | N5

N → ND |ε

D 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

 

  • 試構造與正規式R = (ba|a)*等價的狀態最少的DFA。

 

                  

 

設有如下的基本塊:

X:=B*C

Y:=B/C

Z:=X+Y

W:=9*Z

G:=B*C

T:=G*G

W:=T*G

L:=W

M:=L

畫出該基本塊的DAG圖。假設只有L在基本塊後面還要被引用,給出優化後的四元式序列。

 

 

 

 

 

 

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