记录一些自己在复习时做的题目以及我认为的复习顺序。
编译原理是一门很难的学科,但万幸是它的考试题目有迹可循。
我在备考时,并没有刷完每一年的卷子,只是挑了其中的部分做了一下。题目的同质化很严重,知识点来来回回就是那几个。完整的卷子我整理好之后放链接。
希望趁现在还能记着,把一些优价值的备考准备经验留下来,能在多大程度上帮助大家,就不一定了。
大致可以分为以下几类
对应着编译器完成的几步。
有关前三部分:词法分析,语法分析,语法制导翻译,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橙学长没有整理的部分语法制导翻译,中间代码,和优化部分进行一些整理。
语义分析和语法制导翻译(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)中的分析树,计算属性值。
我的作答:
三、(15 分)考虑以下语法制导定义 SDD,为该 SDD 写出一个翻译模式。
中间代码生成(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
- (10分)画出DAG图;
- (10分)设C是出基本块后的活跃变量,请给出优化后的四元式序列。
作答如下(这个没有校对过答案,自己写的,仅供参考)
我这里主要对于优化部分做的题目进行一些整理:
考虑以下控制流图:
- (10分)请给出控制流图中1-5位置的活性变量,我们假设出口处没有任何活性变量;
- (10分)采用何种方式给此段代码分配寄存器使得所需寄存器数量最少,请给出具体分配方法以及分配过程。
?作答如下(跟同学校对过答案,约定<in,out>表示每个语句的in和out):
中间表示和代码生成(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)写出优化后的中间代码。
我的作答如下(只有解题的思路,没有完整的答案)
?这是学霸同学(@郑神)的作答如下:
四、(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)问当作独立的来做的,也就是说,我后面的活性分析,并没有在优化的基础上进行,还是用的原来的图和代码。但是对于这个有不同的理解,我的学霸同学(@段神)按照优化之后的来做的,并且是逐句分析,在这里,也可以参考:
?另一位同学(@郑神)使用按块分析做的,也放在这里,供参考。
感觉主要是考察一个对于活性分析的方法,这道题没有太明确具体的做法。但是方法要掌握。