① 編譯原理四元式
四元式的一般形式為(op, arg1, arg2, result),其中:op為一個二元(也可以是零元或一元)運算符。arg1和arg2為兩個運算對象,可以是變數、常數或者系統定義的臨時變數名。result為運算結果。
第一步:T1=a*b,
第二步:T2=c*d,
第三步:T3=T2/e,
第四步:T4=T1-T3,
第五步:f=T4.
② 四元式序列是什麼 要把這個翻譯成四元式序列怎麼翻譯
所謂四元式是一種表示中間代碼的方式,跟三元式、波蘭式、逆波蘭式的目的是一樣的,但四元式在表示簡單賦值語句方面非常直觀明了,四元式的格式:
(操作符,第一操作數,第二操作數,保存結果的變數)
例如:k:=k+1
四元式寫成:(+,k,1,k)
如果表達式右邊只有單操作數,那就相應位置無值,如:
k:=+1
四元式為:(+,-,1,k)
遇到邏輯條件表達式就要分別給出條件為真時的轉移路徑和條件為假時的轉移路徑,如:
if k>1
四元式為:(j>,k,1,?) ,表示條件為真的時候要轉移到的地址「?」
(j,-,-,?),表示條件為假時無條件轉移到這個地址「?」
「?」表示的地址可以用地址回填的方法確定
假設起始地址是100
begin
100:(+,-,100,k)
101:(+,i,j,t1)
102:(j>,k,t1,104)
103:(j,-,-,106)
104:(-,k,1,k)
105:(j,-,-,102)
106:(*,i,i,t2)
107:(*,j,j,t3)
108:(-,t2,t3,k)
109:(+,-,0,i)
110:(+,-,0,j)
end
③ 編譯原理問題,求解答
好,我來幫你理解一下,先看基本知識:
四元式是一種比較普遍採用的中間代碼形式。四元式的四個組成成分是:算符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:(程序繼續執行)
④ 編譯原理 三元式轉四元式
#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:沒調試,是以前的代碼改的,機器上沒裝編譯器
*/
⑤ 編譯原理 把下面程序段翻譯成四元式序列
四元式類似於三地址指令:波蘭式。
0:(=,M,—,A); 簡單賦值表達式翻譯:a = m;
1:(=,N,—,B); B=N;
2:(<,A,B,4) ; 控制語句翻譯 :IF A<B GOTO 4;
3:(jump,—,—,6); 直接轉移語句;JUMP TO 6;
4:(=,N,—,T); T=N;
5:(jump,—,—,7) jump to 7;
6:(=,M,—,T) T=M;
7:(=,T,—,C). C=T;