HNU-编译原理-期末复习(刷题)

发布时间:2024年01月11日

【前言】

记录一些自己在复习时做的题目以及我认为的复习顺序。

编译原理是一门很难的学科,但万幸是它的考试题目有迹可循。

我在备考时,并没有刷完每一年的卷子,只是挑了其中的部分做了一下。题目的同质化很严重,知识点来来回回就是那几个。完整的卷子我整理好之后放链接。

希望趁现在还能记着,把一些优价值的备考准备经验留下来,能在多大程度上帮助大家,就不一定了。

【题目分类】

大致可以分为以下几类

  • 词法分析
  • 语法分析
  • 语法制导翻译
  • 中间代码
  • 优化

对应着编译器完成的几步。

【词法分析,语法分析,语法制导翻译】

有关前三部分:词法分析,语法分析,语法制导翻译,A橙学长已经解析的比较充分了。大家可以去看A橙学长对于这三部分的题目整理和答案整理(强烈推荐):

A橙:编译原理期末复习文章浏览阅读889次,点赞7次,收藏37次。编译原理期末复习_写出下述文法的翻译方案c->(e) then s a a->elseif(e) thrn s a|b b->else s|空https://blog.csdn.net/Aaron503/article/details/129078382【注意到前几年基本上考的都是LR文法,今年2023年考的是LL文法,所以这个要引起注意,两类文法都要掌握】

我接下来对A橙学长没有整理的部分语法制导翻译,中间代码,和优化部分进行一些整理。

【语法制导翻译补充】

2020 语法制导翻译

语义分析和语法制导翻译(20分)

以下无上下文文法描述了一种简单编程语言的部分语法。非终结符以大写字母表示,终结符以小写字母表示。VAR表示变量名,CONST表示常量。

PROGRAM → Procedure STMT-LIST
STMT-LIST → STMT STMT-LIST
            |  STMT
STMT  → do VAR = CONST to CONST { STMT-LIST }
|  ASSN-STMT

(1)画出以下代码的分析树: ??????

Procedure

do i = 1 to 100 {

ASSN-STMT

ASSN-STMT

}

ASSN-STMT

(2)创建一个或多个属性,并将语义函数添加到上述语法中,以计算符合该语法的程序中已执行的ASSN-STMT语句的数量。

(3)使用(1)中的分析树,计算属性值。

我的作答:

2022 语法制导翻译

三、(15 分)考虑以下语法制导定义 SDD,

为该 SDD 写出一个翻译模式。
我的作答如下:

【中间代码】

2018 中间代码

中间代码生成(20分)

有如下基本块:

T1 = S+R

T2 = 3

T3 = 12/T2

C = T1 * T3

T4 = S/R

A = T1 – T4

T5 = S + R

B = T5

A = T5 – T4

T6 = T5 * T3

B = T6

C = A * B

  1. (10分)画出DAG图;
  2. (10分)设C是出基本块后的活跃变量,请给出优化后的四元式序列。

作答如下(这个没有校对过答案,自己写的,仅供参考)

【优化】

我这里主要对于优化部分做的题目进行一些整理:

2018 优化

考虑以下控制流图:

  1. (10分)请给出控制流图中1-5位置的活性变量,我们假设出口处没有任何活性变量;
  2. (10分)采用何种方式给此段代码分配寄存器使得所需寄存器数量最少,请给出具体分配方法以及分配过程。

?作答如下(跟同学校对过答案,约定<in,out>表示每个语句的in和out):

2020 优化

中间表示和代码生成(20分)

考虑以下代码,该代码计算2个向量的内积:

prod := 0;
   i := 1;
   repeat {
         prod := prod + a[i] * b[i]
         i = i+ 1;
     until i > 20   
 }

以下是此程序可能的三地址码:

(1) prod := 0
(2) i := 1
(3) t1 := 4 * i
(4) t2 := a[t1]
(5) t3 := 4 * i
(6) t4 := b[t3]
(7) t5 := t2 * t4
(8) t6 := prod + t5
(9) prod := t6
(10) t7 := i + 1
(11) i := t7
(12) if i <= 20 goto (3)
(13) …

(1)创建基本块和控制流程图;

(2)在图表上显示到达定义;

(3)显示可以找到的所有优化;

(4)写出优化后的中间代码。

我的作答如下(只有解题的思路,没有完整的答案)

?这是学霸同学(@郑神)的作答如下:

2022 优化?

四、(45 分)考虑下面这个三地址码程序:
1 a := input
2 b := input
3 t1 := a + b
4 t2 := a * 2
5 c := t1 + t2
6 if a < c goto 8
7 t2 := a + b
8 b := 25
9 c := b + c
10 d := a - b
11 if t2 = 0 goto 17
12 d := a + b
13 t1 := b - c
14 c := d – t1
15 if c < d goto 3
16 c := a + b
17 output c
18 output d
(1)指出每个基本块从哪一行开始,并给出每一个基本块的第一条指令的行号。
(2)用 B 1 ,B 2 ,…来依次命名每个基本块,并用这样的表示画出这些基本块的控制流图。
(3)检查是否有可以进行的优化手段, 写出优化后的代码。
(4)对每个基本块做出活性分析。
(5)根据活性分析实现一个最优化的寄存器分配方案。

?作答如下

另外,根据第5题分配寄存器的意思,这道题我感觉是需要进行逐句分析的。(不同班组教的不一样,我们老师教的按块分析,另一个班组的老师教的逐句分析,这里按照实际情况我觉得逐句分析会更好一些),下面我写出了逐句分析的,红字是迭代一次之后变更的。

关于本题,我是把第(3)问当作独立的来做的,也就是说,我后面的活性分析,并没有在优化的基础上进行,还是用的原来的图和代码。但是对于这个有不同的理解,我的学霸同学(@段神)按照优化之后的来做的,并且是逐句分析,在这里,也可以参考:

?另一位同学(@郑神)使用按块分析做的,也放在这里,供参考。

感觉主要是考察一个对于活性分析的方法,这道题没有太明确具体的做法。但是方法要掌握。

文章来源:https://blog.csdn.net/qq_39480177/article/details/135527004
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。