編譯原理 第七章 學習總結

一:語義分析概述
語義分析任務
1.審查每一個語法結構的靜態語義,即驗證語法正確的結構是否有意義。
2.在語義正確的基礎上生成一種中間代碼或目標代碼。
語義分析範圍
1.確定類型:確定標識符所關聯的數據類型。
2.類型檢查:按語言的類型規則,檢查運算的合法性與運算分量類型的一致性,必要時作類型轉換。
3.識別含義:根據語言的語義定義(形式或非形式),識別程序中各構造成分組合到一起的含義,並作相應的語義處理
4.控制流檢查:控制流語句必須轉移到合法的地方。如C中,break語句規定跳出最內層的循環或switch語句。
5.一致性檢查:在很多場合要求對象只能被說明一次。如:pascal語言規定同一個標識符在一個分程序中只能被說明一次等。
6.相關名字檢查:如:Ada,循環或塊可以有一個名字,它出現在這些結構的開頭或結尾。編譯程序必須檢查這兩個地方用的名字是否相同。
語法制導翻譯 
    所謂語法制導翻譯是指:對文法中的每個產生式都附加上一個語義動作或語義子程序。伴隨着語法分析,每當使用一條產生式進行推導或歸約時,就執行相應產生式的語義動作(包括:查填表格,改變變量的求值,診察與報告錯誤,生成中間代碼等),從而完成預定的翻譯工作。
圖表示法
抽象語法樹。    
無循環有向圖(DAG)
      DAG與抽象語法樹基本上一樣,對表達式中的每個子表達式,DAG中都有一個結點。一個內部結點表示一個操作符,它的孩子表示操作數。
      兩者所不同的是,在一個DAG中代表公共子表達式的結點具有多個父結點,而在一棵抽象語法樹中公共子表達式被表示爲重複的子樹。
二:三元式

逆波蘭表示法
      波蘭表示是一種既不須考慮優先關係、又不用括號的一種表示表達式的方法(前綴式)。
現在我們要介紹的剛好是另一種波蘭表示形式,稱爲後綴式,即運算符在後。

 1.三元式由三個部分組成:
           算符:OP
      第一運算分量:ARG1
      第二運算分量:ARG2
語法制導產生三元式
(1) E→E1 op E2  我們用E.val表示一個指示器,它或指向有關符號表的某項,或指向三元式表的某項,於是其語義子程序爲:
       {E.val:=TRIP(OP,E1.val,E2.val)}
      這兒TRIP(OP,ARG1,ARG2)是一個語義過程,它產生(OP,ARG1,ARG2)並放入三元式表中,返回三元式在表中的位置

(2)E→i  {E.val:=Entry(i)}
    Entry是一個語義過程,它查找i在符號表中的位置。若用LOOKUP(NAME)函數表示對NAME查找符號表,找到則返回表項位置,找不到則返回NULL。 於是可如下實現:

      詞法分析器掃描到標識符i時送回(種別碼,i值),語法分析器把i放入語義變量i.LEXCAL中,這時就可以調用Entry過程:

無循環有向圖(DAG)
      DAG與抽象語法樹基本上一樣,對表達式中的每個子表達式,DAG中都有一個結點。一個內部結點表示一個操作符,它的孩子表示操作數。
      兩者所不同的是,在一個DAG中代表公共子表達式的結點具有多個父結點,而在一棵抽象語法樹中公共子表達式被表示爲重複的子樹

三:某些語句的四元式及翻譯

說明語句的翻譯
爲局部名字建立符號表條目
爲它分配存儲單元
符號表中包含名字的類型和分配給它的存儲單元的相對地址等信息    

一、說明語句的翻譯
     程序語言中的說明語句都是給編譯程序提供信息的,諸如類型、維數、每維的界種類等,因此一般不生成目標,只是在編譯時把有關信息填入相應表格即可。
類型轉換
    我們可以把類型信息反映到運算符中,例如用+i,*i表示定點+、*,用+r,*r表示浮點+、*。有的程序設計語言允許混合運算,有的不允許。如果不允許,則發現有類型不相同的運算分量就應該報錯。如果允許,就要進行類型轉換。
四:循環與分情況語句的翻譯
例如F1→for i:=E1 對應的語義動作:
   (1)產生四元式:emit(:=,E1.place,--,ENTRY(i));
   (2)保留ENTRY(i):F1.place:=ENTRY(i);
   (3)因爲goto over 的轉移地址暫時填不上,必須
      建鏈:F1.chain:=nextquad;
   (4)產生無條件轉移指令:emit(j,--,--,0);
   (5)保留again的地址:F1.quad:=nextquad;
五:過程調用的翻譯
   1. 過程調用主要解決兩個問題:
      (1)把程序控制轉移到子程序(過程段),執行完畢再返回。這個問題很好解決。
      (2)傳遞實在參數。我們前面談到過幾種不同的參數傳遞方式(傳名、傳值、傳地址),它們的語義動作也就有所區別。
六:中間代碼
把經過語法分析和語義分析而獲得的源程序中間表 示翻譯爲中間代碼表示。
中間語言 
  語法樹 
  後綴式
  三地址代碼表示
圖表示法 
    語法樹,有向非循環圖和後綴式表示源程序的自然層次結構。
三地址語句的種類
1.賦值語句
2.無條件轉移語句
3.條件轉移語句
4.複製語句
5.過程調用語句
6.索引語句
7.地址和指針語句
布爾表達式
  用布爾運算符號(and,or,not)作用到布爾變量或關係表達式上而組成
布爾表達式的作用:
 1. 用作計算邏輯值
 2. 用作控制流語句如if-then,if-then-else和while-do等之中的條件表達式

 控制流語句中的布爾表達式的翻譯

 對於出現在條件語句  if E then s1 else s2中的布爾表達式E,其作用就是控制對S1和S2的選擇
因此,作爲條件的布爾表達式,把它設計成兩個出口:E.true   和   E.false
考慮E的上下文,對於IF語句,E.true   指向S1,   E.false指向S2;對於while語句E.true  指向循環的開始,   E.false指向while 的下一語句
回填
兩遍掃描:
對語法樹按深度優先遍歷,來進行語義分析
從給定的輸入構造出一棵語法樹;

一遍掃描:語法制導翻譯技術是屬於一遍掃描分析

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