① 编译原理四元式
四元式的一般形式为(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;