编译原理——将代码翻译成四元式序列

四元式的定义

四元式的一般形式为(op, arg1, arg2, result),其中:

  • op为一个二元(也可以是零元或一元)运算符
  • arg1arg2为两个运算对象,可以是变量、常数或者系统定义的临时变量名
  • result为运算结果。

在中间代码生成阶段中,我们需要对源代码生成一个四元式序列。

其中,op可以为数学运算符(+-*/%=等),例如:
a = b + c的四元式为(+, b, c, a)

也可以是布尔运算符(jjnzjezjrop),例如:
(j, _, _, p)表示无条件跳转第p个四元式
(jnz, A, _, p)表示若A为真则跳转到第p个四元式
(jez, A, _, p)表示若A为假则跳转到第p个四元式
(jrop, A, B, p)表示若A rop B为真则跳转到第p个四元式

实例

实例1:将下列的IF语句翻译成四元式序列
if A and B and (C > D)
then
	if A < B then F := 1
	else F := 0
else G := G + 1

首先将上述语句转换为流程图:
在这里插入图片描述

红色的数字表示该逻辑对应的地址,最终得出每个地址的四元式序列为:

  1. (jnz, A, _, 3),含义为当A为真时跳转到地址3。
  2. (j, _, _, 13),其含义为A为假时跳转到地址13。
  3. (jnz, B, _, 5),含义为当B为真时跳转到地址5。
  4. (j, _, _, 13),其含义为B为假时跳转到地址13。
  5. (j>, C, D, 7),含义为当C>D为真时跳转到地址7。
  6. (j, _, _, 13),其含义为B为假时跳转到地址13。
  7. (j<, A, B, 9)
  8. (j, _, _, 11)
  9. (:=, 1, _, F)F:=1的四元式
  10. (j, _, _, 15)
  11. (:=, 0, _, F)F:=0的四元式
  12. (j, _, _, 15)
  13. (+, G, 1, G)(:=, T, _, G),其含义为G:=G+1的四元式,因为该语句分为了两步:第一步计算G + 1,第二步将第一步计算的结果赋给G,所以有两个四元式。
实例2:将下列的FOR语句翻译成四元式序列
for i := a + b * 2 to c + d + 10 do
	if h > g then p := p + 1

将上述语句转换为流程图:
在这里插入图片描述
四元式序列:

  1. (*, b, 2, t1),先将2 * b的结果赋给t1
  2. (+, a, t1, t2),将t1 + a的结果赋给t2
  3. (+, c, d, t3),将c + d的结果赋给t3
  4. (+, t3, 10, t4),将t3 + 10的结果赋给t4
  5. (:=, t2, _, i),将t2赋给i
  6. (:=, t4, _, t),将t4赋给t
  7. (j, _, _, 10),跳转到10;
  8. (+, i, 1, t5),将i + 1结果赋给t5
  9. (:=, t5, _, i),将t5的值赋给i
  10. (j<=, i, t, 11)i <= t为真时跳转到11;
  11. (j>, h, g, 13)h > g时跳转到13;
  12. (j, _, _, 8),直接跳转到8;
  13. (+, p, 1, t6),将p + 1的值赋给t6
  14. (:=, t6, _, p),将t6的值赋给p
  15. (j, _, _, 8),直接跳转到8。
发布了117 篇原创文章 · 获赞 96 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/abc123lzf/article/details/103753507