編譯原理 第二章 學習總結

編譯原理 第二章 學習總結
第二章學習的是高級語言及語法描述,首先是程序語言的定義,從語法語義
方面來定義語言。接下來是高級語言的一般特性,高級語言的分類包括強制式語言
,應用式語言,基於規則的語言和面嚮對象語言,本章的重點是上下文無關文法,
下面選擇書本後面的練習題來說明:
T6:N -> D|ND,D -> 0|1|2|3|4|5|6|7|8|9,問它的語言
L是什麼?N能轉換成D,也就是能得到0到9的一位數字,或者N推出ND,N繼續推出0到9的數字,
於是L的語言就是一竄由0到這10個數字組成的一個竄,至少是1位,至多不限。(2)給出0127,34,568
的最左推導和最右推導。
這裏只展示568的做法,另外兩個類似:
  N->ND->NDD->DDD->5DD->56D->568  這是568的最左推導。
  N->ND->N8->ND8->N68->D68->568  這是568的最右推導。
  好像難度一般吧。
下面看看第7題。
7:寫一個文法,使其語言是奇數集,而且每個奇數不以0開頭。
    G(S):
        S->E|AE
        E->1|3|5|7|9
        A->AD|N
        D->0|N
        N->2|4|6|8|E
     首先S能得到E。E可以是1,3,5,7,9,這就說明得到了只有一位的奇數;如果推出AE,則隨後一位也是奇數,最後得到奇數沒問題,再看A推出什麼,
     A如果推出N,N可以得到1到9這九個數字中的任何一個,可以保證開頭不爲0;如果A推出AD,這中間的部分是D,D能推出0到9這是個數字,所以問
     題解決了。
  
9:證明下面的文法是二義的:
      S -> iSeS|iS|i   
    iiiei有兩棵語法樹,
第一:S->iSeS->iSei->iiSei->iiiei
第二:S->iS->iiSeS->iiSei->iiiei


10:把下面的文法改寫成無二義的:
 S -> SS|(S)|()
有兩個解決二義性的基本方法。其一是:設置一個規則,該規則可在每個二義性情況下指出哪一個分析樹(或語法樹)是正確的。
這樣的規則稱作消除二義性規則。這樣的規則的用處在於:它無需修改文法就可消除二義性;
另一種方法是將文法改變成一個強制正確分析樹的構造的格式,這樣就可以解決二義性了。當然在這兩種辦法中,都必須確定在二義性情況下
哪一個樹是正確的。這就再一次涉及到語法制導翻譯原則了。我們所需的分析語法樹應能夠正確地反映將來應用到構造的意義,以便將其
翻譯成目標代碼。S->TS|T  T->S|() 
11.給出下列語言的相應文法:
(1)L1={anbnci|n>=1,i>=0}
注意一下,這裏的an是指a的n次方,bnci也一樣。
S->AC
A->aAb|ab
C->cC|?
?表示空集。
(2)L2={aibncn|n>=1,i>=0}
   S->AB
   A->aA|?
   B->bBc|bc
(3)L3={anbnambm|n,m>=0}
  S->AB
  A->aAb|?
  B->1B0|A
(4)L4={1n0m1m0n|n,m>=0}
   S->A|B
   A->0A1|?
   B->1B0|A
        歡迎大佬們批評指教。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章