编译原理 四元式

写出下列代码段的四元式形式:
while ( a<c && b<0 )
if (a==b) c=c+1;
else while (a<d) a=a+2;

写出下列代码段的四元式形式:
if ( ( (a+b<c+d || a>b) && k<n) || x+y*z > a+b)
if (a>b) while (a<d) a=a+2;
else { c=c+b; aaa(x+y,z);}

四元式是一种比较普遍采用的中间代码形式。

代码段的四元式表达式

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:(程序继续执行)

扩展资料:

四元式是一种更接近目标代码的中间代码形式。由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。

四元式实际上是一种“三地址语句”的等价表示。它的一般形式为:

(op,arg1,arg2,result)

其中, op为一个二元 (也可是一元或零元)运算符;arg1,arg2分别为它的两个运算 (或操作)对象,它们可以是变量、常数或系统定义的临时变量名;运算的结果将放入result中。四元式还可写为类似于PASCAL语言赋值语句的形式:

result ∶= arg1 op arg2

需要指出的是,每个四元式只能有一个运算符,所以,一个复杂的表达式须由多个四元式构成的序列来表示。例如,表达式A+B*C可写为序列

T1∶=B*C

T2∶=A+T1

其中,T1,T2是编译系统所产生的临时变量名。当op为一元、零元运算符 (如无条件转移)时,arg2甚至arg1应缺省,即result∶=op arg1或 op result ;对应的一般形式为:

(op,arg1,,result)

(op,,,result)

参考资料来源:百度百科-四元式

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-26
好,我来帮你理解一下,先看基本知识:
四元式是一种比较普遍采用的中间代码形式。四元式的四个组成成分是:算符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:(程序继续执行)追问

意思我能大概明白,但就是无从下手

本回答被提问者和网友采纳
相似回答