當前位置:首頁 » 編程軟體 » 編譯原理三元式a2

編譯原理三元式a2

發布時間: 2025-08-30 19:43:41

1. 編譯原理 四元式問題,求解釋,

好,我來幫你理解一下,先看基本知識:
四元式是一種比較普遍採用的中間代碼形式。四元式的四個組成成分是:算符op,第一和第二運算對象ARG1和ARG@及運算結果RESULT。運算對象和運算結果有時指用戶自己定義的變數,有時指編譯程序引進的臨時變數。例如a∶=b*c+b*d的四元式表示如下:
(1)(*,b,c,t1)
(2)(*,b,d,t2)
(3)(+, t1, t2, t3)
(4)(∶=,t3, -, a)
四元式和三元式的主要不同在於,四元式對中間結果的引用必須通過給定的名字,而三元式是通過產生中間結果的三元式編號。也就是說,四元式之間的聯系是通過臨時變數實現的。
有時,為了更直觀,也把四元式的形式寫成簡單賦值形式或更易理解的形式。比如把上述四元式序列寫成:
(1)t1∶=b*c
(2)t2∶=b*d
(3)t3∶=t1+t2
(4)a∶=t3
把(jump,-,-,L)寫成goto L
把(jrop,B,C,L)寫成if B rop C goto L
好,下面分析一下a<b
這是一個表達式,它的結果要麼是0,要麼是1,因為沒有指定這個表達式存放在哪,所以需要一個臨時變數來存放它的,在你的問題中,就是T。很顯然T有2個值:0或者1
因此,有
101 T:=0 (這個是表達式為假的出口)
103 T:=1 (這個是表達式為真的出口)
因為你的表達式只有一個A<B,因此A<B的真假出口就是表達式的真假出口,所以
100: if a<b goto 103 (a<b為真,跳到真出口103)
101: T:=0(否則,進入假出口)
102: goto 104 (當然要跳過真出口羅,否則T的值不就又進入真出口了,變成真了)
103: T:=1
104:(程序繼續執行)

2. 編譯原理 三元式轉四元式

#include<iostream>
#define LEN 9
using namespace std;
bool used[LEN];
int buf[LEN];
void output(int a[]){
/*
for(int i=0; i<LEN; i++)
cout<<a[i]<<" ";
cout<<endl;
*/
int x,y,z;
x=a[0]*10+a[1];
y=a[2]*100+a[3]*10+a[4];
z=a[5]*1000+a[6]*100+a[7]*10+a[8];
if(x*y==z)
cout<<x<<" * "<<y<<" = "<<z<<endl;
}
void dfs(int deep) {
if (deep == LEN) {
output(buf);
return;
}
for (int i = 0; i < LEN; i++){
if (used[i] == false) {
buf[deep] = i + 1;
used[i] = true;
dfs(deep+1);
used[i] = false;
}
}
}

int main() {
memset(used, false, sizeof(used));
dfs(0);
}
/*
還可以剪枝,懶得弄了,1秒鍾應該可以出結果。
PS:沒調試,是以前的代碼改的,機器上沒裝編譯器
*/

3. a*(b*c+d*e)+a,編譯原理

逆波蘭式又稱為後綴表達式。

a*(b*c+d*e)+a

->(a*(b*c+d*e))a+

->(a(b*c+d*e)*)a+

->(a((b*c)(d*e)+)*)a+

->(a(bc*de*+)*)a+

->abc*de*+*a+

三元式:

  1. (*,b,c)

  2. (*,d,e)

  3. (+,1,2)

  4. (*,a,3)

  5. (+,4,a)

四元式:

  1. (*,b,c,T1)

  2. (*,d,e,T2)

  3. (+,T1,T2,T3)

  4. (*,a,T3,T4)

  5. (+,T4,a,T5)

抽象語法樹:

4. 什麼是編譯程序

編譯程序指將某一種程序設計語言寫的程序翻譯成等價的另一種語言的程序的程序, 稱之為編譯程序

編譯程序也稱為編譯器,是指把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。編譯程序屬於採用生成性實現途徑實現的翻譯程序。

它以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出。編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。

編譯程序的實現演算法較為復雜,這是因為它所翻譯的語句與目標語言的指令不是一一對應關系,而是一多對應關系,同時也因為它要處理遞歸調用、動態存儲分配、多種數據類型,以及語句間的緊密依賴關系。

由於高級程序設計語言書寫的程序具有易讀、易移植和表達能力強等特點,編譯程序廣泛地用於翻譯規模較大、復雜性較高、且需要高效運行的高級語言書寫的源程序。

(4)編譯原理三元式a2擴展閱讀:

編譯流程分為了四個步驟:

1.預處理,生成預編譯文件(.文件)

2.編譯,生成匯編代碼(.s文件)

3.匯編,生成目標文件(.o文件)

4.鏈接,生成可執行文件

5. 編譯原理全部的名詞解釋

書上有別那麼懶!。。。。
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序。解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句。
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序)。
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的。):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的。
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法。
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞歸)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞歸
文法符號的屬性:單詞的含義,即與文法符號相關的一些信息。如,類型、值、存儲地址等。
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法。
V:屬性的有窮集。每個屬性與文法的一個終結符或非終結符相連。屬性與變數一樣,可以進行計算和傳遞。
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集。斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性。
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性。
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性。
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程序提供。
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞。
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作。
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算。
中間代碼(中間語言)
1、是復雜性介於源程序語言和機器語言的一種表示形式。
2、一般,快速編譯程序直接生成目標代碼。
3、為了使編譯程序結構在邏輯上更為簡單明確,常採用中間代碼,這樣可以將與機器相關的某些實現細節置於代碼生成階段仔細處理,並且可以在中間代碼一級進行優化工作,使得代碼優化比較容易實現。
何謂中間代碼:源程序的一種內部表示,不依賴目標機的結構,易於代碼的機械生成。
為何要轉換成中間代碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言。
(2)便於移植,便於修改,便於進行與機器無關的優化。
中間代碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和信息欄。
信息欄包含許多子欄和標志位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄。主欄的內容稱為關鍵字(key word)。
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查標識符屬性在上下文中的一致性和合法性。(3)作為目標代碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的類型 (整型、實型、字元串型等))3. 符號的存儲類別(公共、私有)
4. 符號的作用域及可視性 (全局、局部) 5. 符號變數的存儲分配信息 (靜態存儲區、動態存儲區)
存儲分配方案策略:靜態存儲分配;動態存儲分配:棧式、 堆式。
靜態存儲分配
1、基本策略
在編譯時就安排好目標程序運行時的全部數據空間,並能確定每個數據項的單元地址。
2、適用的分配對象:子程序的目標代碼段;全局數據目標(全局變數)
3、靜態存儲分配的要求:不允許遞歸調用,不含有可變數組。
FORTRAN程序是段結構,不允許遞歸,數據名大小、性質固定。 是典型的靜態分配
動態存儲分配
1、如果一個程序設計語言允許遞歸過程、可變數組或允許用戶自由申請和釋放空間,那麼,就需要採用動態存儲管理技術。
2、兩種動態存儲分配方式:棧式,堆式
棧式動態存儲分配
分配策略:將整個程序的數據空間設計為一個棧。
【例】在具有遞歸結構的語言程序中,每當調用一個過程時,它所需的數據空間就分配在棧頂,每當過程工作結束時就釋放這部分空間。
過程所需的數據空間包括兩部分
一部分是生存期在本過程這次活動中的數據對象。如局部變數、參數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄信息(連接數據)。
活動記錄(AR)
一個過程的一次執行所需要的信息使用一個連續的存儲區來管理,這個區 (塊)叫做一個活動記錄。
構成
1、臨時工作單元;2、局部變數;3、機器狀態信息;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是代碼優化
所謂優化,就是對代碼進行等價變換,使得變換後的代碼運行結果與變換前代碼運行結果相同,而運行速度加快或佔用存儲空間減少。
優化原則:等價原則:經過優化後不應改變程序運行的結果。
有效原則:使優化後所產生的目標代碼運行時間較短,佔用的存儲空間較小。
合算原則:以盡可能低的代價取得較好的優化效果。
常見的優化技術
(1) 刪除多餘運算(刪除公共子表達式) (2) 代碼外提 +刪除歸納變數+ (3)強度削弱; (4)變換循環控制條件 (5)合並已知量與復寫傳播 (6)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊。

給我分數啊。。。

6. 編譯原理問題,求解答

好,我來幫你理解一下,先看基本知識:
四元式是一種比較普遍採用的中間代碼形式。四元式的四個組成成分是:算符op,第一和第二運算對象ARG1和ARG@及運算結果RESULT。運算對象和運算結果有時指用戶自己定義的變數,有時指編譯程序引進的臨時變數。例如a∶=b*c+b*d的四元式表示如下:
(1)(*,b,c,t1)
(2)(*,b,d,t2)
(3)(+, t1, t2, t3)
(4)(∶=,t3, -, a)
四元式和三元式的主要不同在於,四元式對中間結果的引用必須通過給定的名字,而三元式是通過產生中間結果的三元式編號。也就是說,四元式之間的聯系是通過臨時變數實現的。
有時,為了更直觀,也把四元式的形式寫成簡單賦值形式或更易理解的形式。比如把上述四元式序列寫成:
(1)t1∶=b*c
(2)t2∶=b*d
(3)t3∶=t1+t2
(4)a∶=t3
把(jump,-,-,L)寫成goto L
把(jrop,B,C,L)寫成if B rop C goto L
好,下面分析一下a<b
這是一個表達式,它的結果要麼是0,要麼是1,因為沒有指定這個表達式存放在哪,所以需要一個臨時變數來存放它的,在你的問題中,就是T。很顯然T有2個值:0或者1
因此,有
101 T:=0 (這個是表達式為假的出口)
103 T:=1 (這個是表達式為真的出口)
因為你的表達式只有一個A<B,因此A<B的真假出口就是表達式的真假出口,所以
100: if a<b goto 103 (a<b為真,跳到真出口103)
101: T:=0(否則,進入假出口)
102: goto 104 (當然要跳過真出口羅,否則T的值不就又進入真出口了,變成真了)
103: T:=1
104:(程序繼續執行)

熱點內容
伺服器維護計劃怎麼打開 發布:2025-08-31 02:33:58 瀏覽:929
linux發行版與linux 發布:2025-08-31 02:20:00 瀏覽:568
編寫腳本打開一個應用 發布:2025-08-31 02:16:37 瀏覽:66
編譯安裝boost 發布:2025-08-31 01:45:04 瀏覽:38
sql2008數據還原 發布:2025-08-31 01:45:00 瀏覽:891
電視廣告腳本範文 發布:2025-08-31 01:33:10 瀏覽:454
p2p網貸系統源碼下載 發布:2025-08-31 01:10:34 瀏覽:905
在線聊天室源碼 發布:2025-08-31 01:10:33 瀏覽:62
python入門知乎 發布:2025-08-31 00:58:06 瀏覽:202
浪潮全快閃記憶體儲 發布:2025-08-31 00:56:35 瀏覽:741