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

編譯三元式

發布時間: 2022-07-17 01:31:33

⑴ 描述一般的編譯程序可分為哪些階段,每個階段的目的是什麼

其目的是保證標識符和常數的正確使用,把必要的信息...綜合部分 綜合階段必須根據符號表和中間語言程序產生...目標程序質量,也可以把一個邏輯步驟的工作分為幾遍.

⑵ 編譯原理三元式a:=0怎麼樣表示呢

一.(15分)有表達式如下:A+B*(C-D)**N (**為冪乘) (1)給出該表達式的逆波蘭式表示(後綴式); (2)給出上述表達式的四元式和三元式序列. 一起考研社區真情奉獻 二.(15分)有C程序如下: main() { printf("%d,%d,%d\n",10); } (1)試著寫出上述printf語句輸出的結果; (2)從運行環境和printf的實現分析為什麼會有這樣的輸出結果. www.17ky.cn獨家資料 三.(5分)構造一個DFA(確定的有限自動機),使之接受含偶數個"1"的0,1串集. www.17ky.cn會員奉獻 四.(5分)有文法G,其產生式如下: S->S(S), S->ε /*空產生式*/ 試寫出一個語法制導定義,它輸出配對的括弧個數. www.17ky.cn獨家提供 五.(10分)已知某語言L={a^(m)b^(n)|n>m>=0}.試寫出產生該語言的兩個文法G1和 G2,其中G1是LR(1)文法,G2是非LR(1)和非二義性文法. 更多考研真題,請光臨www.17ky.cn 六.填空(每空一分,共20分) 1.現代操作系統的兩個最基本的特徵是___和___. 2.進程式控制制塊的初始化工作包括___,___和___. 3.在操作系統中引入線程概念的主要目的是___. 4.unix系統v中,系統向用戶提供的用於創建新進程的系統調用是___;用於建立無名 管道的系統調用是___;用於創建有名管道的系統調用是___. 5.unix系統v中,引起進程調度的原因有___,___,___和___等. 6.在分區分配演算法中,首次適應演算法傾向於優先利用內存中___部分的空閑分區,從 而保留了___部分的大空閑區. 7.進行設備分配時所需的數據表格主要有___,___,___和___等. 8.利用符號鏈實現文件共享時,對文件主刪除了共享文件後造成的指針懸空問題,解 決的方法是___. 更多考研真題,請光臨www.17ky.cn 七.(8分)在消息傳遞通信方式下, A.發送進程和接收進程在通信過程中可以採用那三種同步方式? B.試以下面給出的發送進程和接收進程(將接收到的數據存入S)為例,說明當接收進 程執行到標號為L2的語句時,採用這三種同步方式,X的值可能各是多少? 一起考研社區真情奉獻 發送進程P: 接收進程Q: M=10; L1: send M to Q; L1: receive S from P; L2: M=20; L2: X:=S+1; goto L1; 更多考研真題,請光臨www.17ky.cn 八.(8分)一系統具有150個存儲單元,在T0時刻按下表所示分配給3個進程: 進程Maximum demand Current allocation P1 70 25 P2 60 40 P3 60 45 對下列請求應用銀行家演算法分析判定是否是安全的: A.第4個進程P4到達,最大需求60個存儲單元,當前請求分配25個單元. B.第4個進程P4到達,最大需求50個存儲單元,當前請求分配35個單元. 如果是安全的請給出一個可能的進程安全執行序列.如果是不安全的,請說明原因. 更多考研真題,請光臨www.17ky.cn 九、(14分)設正在處理器上執行的一個進程的頁表如下.頁表的虛頁號和物理塊號 是十進制數,起始頁號(塊號)均為0.所有的地址均是存儲器位元組地址,頁的大小為 1024位元組. A.詳述在設有快表的請求分頁存儲管理系統中,一個虛地址轉換成物理內存地址的過程. B.下列虛地址對應與什麼物理地址: (1)5499; (2) 2221; 虛頁號 狀態位 訪問位 修改位 物理塊號 0 1 1 0 4 1 1 1 1 7 2 0 0 0 --- 3 1 0 0 2 4 0 0 0 --- 5 1 0 1 0 www.17ky.cn獨家提供 注釋:訪問位---當某頁被訪問時,其訪問位被置為1. www.17ky.cn考研人的成功俱樂部 編譯原理與操作系統 參考答案 一. (1)後綴式:ABCD-*+ECD-N**/+ (2) 四元式 三元式 (1)( - , C , D , t1) (1)( - , C , D ) (2)( * , B , t1, t2) (2)( * , B ,(1)) (3)( +, A , t2, t3) (3)( +, A ,(2)) (4)( - , C , D, t4) (4)( - , C , D ) (5)(**, t4, N , t5) (5)(**, (4), N) (6)( / , E , t5, t6) (6)( / ,E ,(5)) (7)( +, t3, t6, t7) (7)( +,(3),(6))

⑶ 常見的中間代碼的表示形式有哪三種

1、逆波蘭表示

逆波蘭表示又稱後綴表示法,它是最簡單的一種中間代碼表示形式,早在編譯程序出現之前,它就用於表示算術表達式。

2、四元式

四元式也是一種比較普遍採用的中間代碼形式,其形式為:(OP,ARG1,ARG2,RESULT)。其中:OP為運算符,ARG1為第一運算對象,ARG2為第二運算對象,RESULT為運算結果。

3、三元式

三元式表示是與四元式類似的一種表示法,所不同的僅是三元式中沒有表示運算結果的部分,凡要涉及到運算結果的均用三元式的位置或序號來代替。

三元式的形式為:(OP,ARG1,ARG2),其中,OP為運算符,ARG1為第一運算對象,ARG2為第二運算對象。運算對象ARG1,ARG2可以是變數名,也可以是三元式的編號。

(3)編譯三元式擴展閱讀:

中間代碼相關延伸:代碼優化-優化所涉及的源程序的范圍

局部優化 — 基本塊內優化;

循環優化 — 隱式、顯式循環體內優化;

全局優化 — 一個源程序范圍內優化;

優化相對於編譯邏輯功能實現的階段,中間代碼級 — 目標代碼生成前的優化;目標代碼級 — 目標代碼生成後的優化。

⑷ 編譯原理 寫出表達式 三元序列

三元式
(1)(a,b,+)
(2)(a,b,-)
(3)((1),(2),/)
(4)(b,c,*)
(5)(a,(4),+)
(6)((3),(5),-)
四元式
(a,b,+,x1)
(a,b,-,x2)
(x1,x2,/,x3)
(b,c,*,x4)
(a,x4,+,x5)
(x3,x5,-,x6)

⑸ 編譯原理全部的名詞解釋

書上有別那麼懶!。。。。
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序。解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句。
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序)。
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的。):文法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)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊。

給我分數啊。。。

⑹ 《編譯原理》的一道題 寫出表達式(a+b*c)/(a+b)-d的逆波蘭表示和三元式序列

逆波蘭式可能是這樣,上學期剛考完一個假期有點忘了(abc)(ab)d+*/+-
三元式已經忘得一干二凈了

⑺ 編譯原理問題,求解答

好,我來幫你理解一下,先看基本知識:
四元式是一種比較普遍採用的中間代碼形式。四元式的四個組成成分是:算符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:(程序繼續執行)

⑻ 為什麼要採用中間代碼中間代碼有哪幾種形式(編譯原理)

採用中間代碼是把源程序映射成中間代碼表示,再映射成目標代碼的工作分在幾個階段進行,使編譯演算法更加清晰。中間代碼有四種形式:

1、逆波蘭表示

逆波蘭表示又稱後綴表示法,它是最簡單的一種中間代碼表示形式,早在編譯程序出現之前,它就用於表示算術表達式。

2、四元式

四元式也是一種比較普遍採用的中間代碼形式,

其形式為:(OP,ARG1,ARG2,RESULT)

3、三元式

三元式表示是與四元式類似的一種表示法,所不同的僅是三元式中沒有表示運算結果的部分,凡要涉及到運算結果的均用三元式的位置或序號來代替。

4、樹表示

樹形表示是三元式的翻版。在樹的表示中,樹葉均為運算對象,即常量或變數,其他結點表示運算符。表達式的樹形表示很容易實現:簡單變數或常量的樹就是該變數或常量自身。

(8)編譯三元式擴展閱讀

中間語言的優點:

1、中間語言與具體機器特性無關,一種中間語言可以為生成多種不同型號的目標機的目標代碼服務。

2、可對中間語言進行與機器無關的優化,有利於提高目標代碼的質量。

對於中間語言,要求其不但與機器無關,而且有利於代碼生成。

⑼ 什麼是三元式,四元式,逆波蘭式

1)三元式是把表達式及語句表示成一組三元式,每個三元式由運算符op,運算對象arg1,運算對象2arg2組成,形如(op,arg1,arg2)
舉例: a:=b*c+b*d
(1) (* b,c)
(2) (* b,d)
(3) (+ (1),(2))
(4) (:= (3),a)

2)四元式是較為普遍的中間代碼形式,和三元式比多了一個result,形如(op,arg1,arg2,result),op和arg1之間有逗號,如果有arg是預設的話用-佔位
舉例: a:=b*c+b*d
(1) (*,b,c,t1)
(2) (*,b,d,t2)
(3) (+,t1,t2,t3)
(4)(:=,t3,-,a)

3)逆波蘭表達式是一種最簡單的中間代碼表示形式,把運算對象寫在前面,運算符號寫在後面,例如a+b寫成ab+
實現方法:壓棧,遇到運算對象,壓棧,遇到運算符,取棧頂兩個運算後再壓棧

舉例:a+b*c->abc*+

(a+b)*c->ab+c*

⑽ 編譯原理 輸入任一後綴式,輸出三元式

#include<stdio.h>
void opt(char * arr)
{
int curr=0;
int i=0;
char count='1';
while(arr[i]!='\0')
{
if(arr[i]=='+'||arr[i]=='-'||arr[i]=='*'||arr[i]=='/')
{
printf("%c (%c,%c,%c)\n",count,arr[i],arr[i-2],arr[i-1]);
arr[i-2]=count++;
curr=i+1;
for(;arr[curr]!='\0';curr++)
{
arr[curr-2]=arr[curr];
}
arr[curr-2]='\0';
i-=2;
}
else
{
i++;
}
}
}
void main()
{
char arr[80];
printf("input:\n");
scanf("%s",arr);
opt(arr);
}

熱點內容
演算法設計模式 發布:2025-02-07 19:15:52 瀏覽:743
伺服器1u能連接幾台電腦 發布:2025-02-07 18:50:02 瀏覽:152
立人編譯 發布:2025-02-07 18:48:32 瀏覽:764
日產途達四驅的有哪些配置 發布:2025-02-07 18:42:02 瀏覽:831
伺服器搭建鏡像站 發布:2025-02-07 18:41:55 瀏覽:376
游戲上雲成標配雲伺服器該怎麼選 發布:2025-02-07 18:26:13 瀏覽:141
哪個安卓手機自帶系統沒有廣告 發布:2025-02-07 18:22:36 瀏覽:724
電腦開機後一直在配置更新怎麼進入系統 發布:2025-02-07 18:17:43 瀏覽:12
新浪上傳視頻在哪 發布:2025-02-07 18:17:38 瀏覽:558
外匯點差演算法 發布:2025-02-07 18:16:41 瀏覽:81