编译原理-中间代码生成 课后习题+笔记

博客内容涉及了表达式的有向无环图(DAG)构造,以及不同赋值语句的四元式序列和三元式序列的表示。通过实例展示了如何将数学表达式和数组引用转化为中间代码,并解释了如何处理布尔表达式的回填。此外,还介绍了处理repeat语句和for循环语句的语法制导翻译规则。
摘要由CSDN通过智能技术生成

中间代码生成

来源:龙书(厚),南大课后作业

p232 6.1.1

为下面的表达式构造 DAG

    ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))
Answer

在这里插入图片描述

知识点
  • 表达式的有向无环图 (Directed Acyclic Graph, DAG) 能够指出表达式中的公共子表达式,更简洁地表示表达式
  • 在这里插入图片描述

p238 6.2.2

对下列赋值语句重复练习 6.2.1

  1. a = b[i] + c[j]
  2. a[i] = b*c - b*d
    ==在题目中添加条件:每个数组元素占 8个存储单元。 ==
    (注: 只要求翻译成四元式序列和三元式序列)
Answer
  1. a = b[i] + c[j]

    1. 四元式序列

      o p op op a r g 1 arg_1 arg1 a r g 2 arg_2 arg2 r e s u l t result result
      0* i i i 8 8 8 t 1 t_1 t1
      1=[ ] b b b t 1 t_1 t1 t 2 t_2 t2
      2* j j j 8 8 8 t 3 t_3 t3
      3=[ ] c c c t 3 t_3 t3 t 4 t_4 t4
      4+ t 3 t_3 t3 t 4 t_4 t4 t 5 t_5 t5
      5= t 5 t_5 t5 a a a
    2. 三元式序列

      o p op op a r g 1 arg_1 arg1 a r g 2 arg_2 arg2
      0* i i i8
      1=[ ] b b b(0)
      2* j j j8
      3=[ ] c c c(2)
      4+(1)(3)
      5= a a a(4)
  2. a[i] = b*c - b*d

    1. 四元式序列

      o p op op a r g 1 arg_1 arg1 a r g 2 arg_2 arg2 r e s u l t result result
      0* b b b c c c t ! t_! t!
      1* b b b d d d t 2 t_2 t2
      2- t 1 t_1 t1 t 2 t_2 t2 t 3 t_3 t3
      3* i i i 8 8 8 t 4 t_4 t4
      4+ a a a t 4 t_4 t4 t 5 t_5 t5
      5*= t 3 t_3 t3 t 5 t_5 t5
    2. 三元式序列

      o p op op a r g 1 arg_1 arg1 a r g 2 arg_2 arg2
      0* b b b c c c
      1* b b b d d d
      2-(0)(1)
      3* i i i8
      4+ a a a(3)
      5*=(4)(2)
知识点
  • 三地址指令的四元式三元式表示
  • 在这里插入图片描述
  • 在这里插入图片描述

p247 6.4.3

使用图 6-22 的翻译方案来翻译下列赋值语句:
x = a[ i ] [ j ] + b[ i ] [ j ]

在这里插入图片描述
在题目中添加条件说明:
1) a 表示一个2*3 的整型数组,b 表示一个2*4 的整型数组;
2) 一个整数的宽度为4 个字节。

Answer

x = a[ i ] [ j ] + b[ i ] [ j ] 的注释语法分析树如下
在这里插入图片描述

对应翻译出的三地址代码:

t1=i*12
t2=j*4
t3=t1+t2
t4=a[t3]
t5=i*16
t6=j*4
t7=t5+t6
t8=b[t7]
t9=t4+t8
x=t9
知识点
  • 赋值语句的翻译
  • 数组引用的翻译
  • 在这里插入图片描述

p248 6.4.8

一个按行存放的实数型数组 A[i, j, k] 的下标 i 的范围为 1~4,下标 j 的范围为 0~4,且下标 k 的范围为 5~10。每个实数占 8 个字节。假设数组 A 从 0 字节开始存放,计算下列元素的位置:

  1. A[3, 4, 5]
  2. A[1, 2, 7]
  3. A[4, 3, 9]
Answer
计算公式:0+((i-1) * 5 * 6 + j * 6 + (k-5)) * 8

1. ((3-1) * 5 * 6 + 4 * 6 + (5-5)) * 8 = 672
2. ((1-1) * 5 * 6 + 2 * 6 + (7-5)) * 8 = 112
3. ((4-1) * 5 * 6 + 3 * 6 + (9-5)) * 8 = 896
知识点
  • 数组下标计算

p263 6.6.1

在图 6-36 的语法制导定义中添加处理下列控制流构造的规则:

  1. 一个 repeat 语句:repeat S while B
  2. !一个 for 循环语句:for (S1; B; S2) S3
    在这里插入图片描述
Answer
  1. 一个 repeat 语句:repeat S while B
    在这里插入图片描述

语义规则:

s1.next=newlabel();
B.true=newlabel();
B.false=S.next;
S.code=label(B.true)||S1.code||label(S1.next||B.code||gen('goto' B.true)
  1. !一个 for 循环语句:for (S1; B; S2) S3
    在这里插入图片描述
    语义规则:
S1.next=newlabel();
B.true=newlabel();
B.false=S.next;
S2.next=S1.next;
S3.next=newlabel();
S.code=S1.code||label(S1.next)||B.code||label(B.true)||S3.code
		||label(S3.next)||S2.code||gen('goto' S1.next)
知识点
  • 控制流语句的翻译
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 龙书P244龙书P244

p268 6.7.1

使用图 6-43 中的翻译方案翻译下列表达式。给出每个子表达式的 truelist 和 falselist。你可以假设第一条被生成的指令的地址是 100.

  1. a==b && (c==d || e==f)
  2. (a==b || c==d) || e==f
    在这里插入图片描述
Answer
  1. a==b && (c==d || e==f)

注释语法分析树:
在这里插入图片描述
生成的代码:
在这里插入图片描述
2. (a==b || c==d) || e==f

注释语法分析树:
在这里插入图片描述
生成的代码:
在这里插入图片描述

知识点
  • 布尔表达式的回填
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
### 回答1: 编译原理第三版的课后答案CSND是作者龙书在编写《编译原理第三版》一书时,为帮助读者更好地理解和掌握书中内容,而提供的一套课后习题的解答。CSND是指存放在国内最大的IT技术交流社区CSDN上的这套课后答案。 这套答案的编写旨在帮助读者巩固所学知识点和技能,通过实践习题的解答,加深对编译原理的理解。使用这套答案,读者可以通过对比自己的答案与答案CSND的差异,找出自己在理解和应用上的不足之处,并进行改进。 答案CSND通常包括对习题的详细解析,解答思路的分析和具体的实现代码。读者可以根据自己的需要选择查阅相应习题的答案,以便更好地加深对编译原理的理解。 然而,需要注意的是,作为课后习题的答案,CSND并不能完全代替对原书内容的学习。在使用这套答案时,读者仍然需要结合原书的理论知识来理解习题,并在使用答案的过程中,加强对课程相关的代码实现和算法原理的理解。 总之,编译原理第三版课后答案CSND是一套为编译原理学习者提供的辅助资料,通过使用它可以更好地巩固对编译原理的理解和应用能力。但在使用过程中,读者需要结合原书进行综合学习,以获得更全面的知识和技能。 ### 回答2: 编译原理第三版的课后答案可以在 CSDN 上找到。CSDN 是一个综合性的技术社区,提供了各种各样的编程、计算机科学相关的资源和教程。在 CSDN 上,许多开发者和编程爱好者会分享自己的学习笔记课后习题答案等资源。 如果想要找到编译原理第三版的课后答案,可以在 CSDN 的搜索栏中输入相关关键词,如"编译原理 第三版 课后答案",然后浏览搜索结果。通常会有很多开发者或者教育机构分享的答案。在搜索结果中选择一个合适的答案链接,即可查看或下载相关的课后答案。 不过需要注意的是,编译原理是一门相对复杂的课程,因此建议在自学过程中,多花时间理解教材上的内容和习题,尽量自己独立思考和解答问题。通过自己动手尝试编写代码,并与他人进行讨论,才能更好地理解和掌握编译原理的知识。答案仅供参考,最好还是以自己的理解和解答为主。 ### 回答3: 编译原理第三版是一本经典的教材,对于学习编译原理的人来说非常有用。CSND是一个知名的技术博客网站,上面有很多编译原理相关的文章和资源,包括编译原理第三版的课后答案。 编译原理第三版课后答案在CSND上是可以找到的,只需要在网站上进行相应的搜索即可。在搜索框中输入"编译原理第三版课后答案",就会出现相关的文章或资源,其中很可能包括了课后答案。 通过查看这些课后答案,可以帮助我们巩固所学知识,理解编译原理相关的概念和原理,并能够更好地应用于实际的编译工作中。此外,CSND还有很多其他编程和计算机科学相关的资源,可以帮助我们更好地学习和提高编译原理的水平。 总之,编译原理第三版课后答案可以在CSND上找到,通过查看这些答案可以帮助我们更好地学习和理解编译原理相关的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值