編譯原理 第七章

2021-08-20 11:18:14 字數 3379 閱讀 5781

1、語法樹 

語法樹,有向非迴圈圖和字尾式表示源程式的自然層次結構

2、字尾式

中 綴式: a:=b*-c+b*-c

字尾式:

a b c - * b c - * + =

3、三位址**表示

一般形式    x:=y op z 

4、語法制導翻譯生成三位址**  

需要用到的量:

(1)e.place表示存放e值的名字。 

(2)e.code表示對e求值的三位址語句序列。 

(3)   newtemp是個函式,對它的呼叫將產生   乙個新的臨時變數。

5、三位址**的具體實現

(1)四元式  op, arg1, arg2, result

(2)三元式 op, arg1, arg2

(3)間接三元式  間接碼表+三元式表

二、說明語句

過程中的說明語句 :

乙個過程中的所有說明語句作為乙個類集來處理。

乙個全程變數offset來記錄下 乙個資料在符號表中的相對位址。

賦值語句的翻譯:

表示式的成分可以是整型量、實型量、陣列 元素和記錄。

1、符號表中的名字

名字可以理解為指向符號表中相應該名字表項的指標。

過程lookup(id.name)檢查是否在符號表中存在相應此名字的表項。

lookup(id.name)=   id.entry

nilemit  它將生成的三位址**送到輸出檔案上

例:emit(e.place『:=』e1.place『+』e2.place) 或

emit(= , e1.place,e2.place, e.place)

2、陣列元素位址分配(複雜賦值語句)

陣列元素位址的計算公式

①一維陣列的陣列元素計算公式

base+(i-low )* w

=bace-low*w +  i*w

常量部分+變數部分:bace-low*w +  i*w 

②二維陣列

base+((i1 一low1)* n2+i2 一low2)*w)

= base-((low1 *n2)+low2)*w + ((i1*n2)+i2)* w

令c= ((low1 *n2)+low2)*w    則常量部分=a[low1,low2]-c 

常量部分c=((...((low1*n2+low2)*n3+low3)...)*nk+lowk) * w 

變數部分v= ((...((i1*n2+i2)*n3+i3...)*nk+ik)*w 

所以a[i1,i2,…in]的位址

=base-c+v

布林表示式:用布林運算符號(and,or,not)作用到布林變數或關係表示式上而組成

布林表示式的作用:

1. 用作計算邏輯值

2. 用作控制流語句如if-then,if-then-else和while-do等之中的條件表示式

翻譯布林表示式的方法 

表示乙個布林表示式的值

方法一:用數值表示真和假,從而對布林表示式的求值可以象對算術表示式的求值那樣一步一步地來計算

方法二:另一種方法是根據布林表示式的特點,採用了某種優化措施。

數值表示法:用1表示真,0表示假來實現布林表示式的翻譯。

布林表示式的數值表示法的翻譯模式

·emit用於將乙個三位址語句輸送到檔案中

每執行一次emit後,nextquat自動加1

控制流語句中的布林表示式的翻譯:

對於出現在條件語句  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 的下一語句

基本思想:  假定e 形如a<b,則將生成如下的e的**:

e.true: if a<b goto e.true (真出口)

e.false: goto e.false     (假出口)                     

四元式表示:

e.true:(j

e.false: (j,   ,    , e.false )  (假出口)

用四元式實現三位址碼,真假出口可表示為:

真出口:

(jnz,a,_,p)表示 if a goto p

(jrop,x,y,p)表示 if  x rop y  goto p

假出口:

(j,_,_,p)表示 goto p

回填

生成跳轉語句時,將其e.true和e.false鏈成乙個鍊錶,記錄在e.truelist和e.falselist中

等到轉移目標確定以後,再將轉移出口填入e.truelist和e.falselist中

翻譯模式中用到的三個函式:

①.makelist(i):建立乙個僅包含i的新錶,i  是四元式陣列的乙個索引(下標),或說 i是四元式**序列的乙個標號。

②.merge(p1,p2):連線由指標p1和p2指向的兩個表並且返回乙個指向連線後的表的指標。 merg(p1,p2)= p1 p2=0;

p1 p2≠0;

③.backpatch(p,t):把i作為目標標號回填到p所指向的表中的每乙個轉移指令中去。此處的「表」都是為「反填」所拉的鏈.

使用回填翻譯控制流語句 

先記錄要回填的轉移指令位址,在適當的時候進行回填,以便賦值和布林表示式的求值得到合適的連線,以完成程式的控制流程。

1. 過程呼叫主要解決兩個問題:

(1)把程式控制轉移到子程式(過程段),執行完畢再返回。這個問題很好解決。

(2)傳遞實在引數。我們前面談到過幾種不同的引數傳遞方式(傳名、傳值、傳位址),它們的語義動作也就有所區別。

這是這學期所學的最後乙個章節,趕得緊,也就能理解一些淺顯的東西。臨近考試,還需要把以前的章節重新回顧一下。

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

第七章 TCP和UDP原理

一 引入 1.tcp ip協議族的傳輸層協議主要包括tcp和udp 2.tcp是面向連線的可靠的傳輸層協議。它支援在並不可靠的網路上實現面向連線的可靠的資料傳輸 3.udp是無連線的傳輸協議,主要用於支援在較可靠的鏈路上的資料傳輸,或用於對延遲較敏感的應用 二 tcp ip傳輸層的作用 1.傳輸層作...

第七章 函式

1.ansi c 允許函式原型的使用,函式宣告提供給編譯器和之後的呼叫函式返回值型別,引數型別和數量的資訊,而k c用單獨的列表給出引數的型別,編譯器只記住函式的返回值型別,但不儲存函式的引數數量和型別 2.沒有return語句的函式,隱式的返回 3.函式的原型可以單獨放於乙個標頭檔案中,一定要具有...