编译系统笔记
重点
有三个部分需要认真看:
- LL文法类与LR文法类

- 中间代码生成(语义动作等)
- 三大数据流分析+自然循环分析
- LL/LR文法分析是核心内容,繁琐但是不难,认真做一遍题即可。
中间代码生成需要按PPT模板写,所以每道题都有固定答案,包括临时变量名,跳转Label标号,总行数等。
中间代码需要记模式,而不是模板,不然就只能死记硬背了。
四元式比较简单,变下形就可以。
数据流分析很抽象,时间充裕的话可以看看spoc,推荐期末复习讲座认真听一下,看看各位佬手推分析过程。
其他部分,推荐直接做题,不会的地方再看PPT,最后再看spoc
1)画一个简单的DFA
2)LL(1)构造、画表
3)LR(1)构造、画表
4)修改左递归文法,然后重新设计一个SDD(今年是求二进制数的十进制数值)
5)符号表以及非局部数据访问(访问链)和嵌套深度的考察、
6)三元式的生成和基本块划分、流图、自然循环、支配结点、以及DAG图。
所以大家复习时,一定重点关注这些内容,尤其最后一题中间代码生成代码优化部分的内容,如果中间代码生成出错了,接下来基本没分了..今年这道题是28*0.7分,分值还是相当大的。
第一章
词法分析:
对构成源程序的字符扫描
语法分析:
建立语法树
语义分析:
检查是否合法
代码优化:
目标代码生成:
第二章
文法:
产生式:

句型:
可以含有非终结符
句子:
是必须全为终结符了

语言:

文法类型:


词法分析




4.5



自下向上

LR(0)
- ACTION与GOTO
- 首先发现如果箭头上是非终结符B,则写入GOTO
- 如果是终结符b,则写入ACTION
- acc
- 如果是S’增广文法的最开始,则遇见$,写acc
- 如果是B->aB`, 那个·在最后面,则写ACTION的r

SLR

LR(1)

LR(0)与SLR与LR(1)的rj对比
SLR
只在follow对应的写rj


LR(1)
只在S->L·,a
根据a来写rj位置


语法制导翻译
综合属性:
继承属性

tips

一眼看出综合属性

一眼判断LSDD

SDT
LSDD->SDT



中间代码生成
定义语句翻译
主要是通过type和width确定相对位置offset

赋值语句翻译



增量方法中:

四元式


存储分配

代码优化
基本块的划分
找首指令
如何划分首指令:
1.第一个三地址指令
这里的B1就是三地址指令

2,,跳转指令结束之后的指令
3,跳转指令的目标指令

划分


优化分类
重点学习无关优化

公共子表达式





数据流
分析gen与kill
gen是本块定义的变量
kill是程序中所有其它对*定义y变量

活跃变量分析

可用表达式



支配节点


回边

自然循环

删除公共子表达式

删除复制语句

代码移动

归纳变量


归纳变量的删除



代码生成器

错题






这个去重时候,活跃的变量留到最后(有后台)先杀别人吧

2023.4.9错题


这个S->a|S+S|SS都要提取公因子
并且提取公因子我也做错了


或许需要对¥的符号进行特殊处理
LL(1)自上向下的递归预测分析法——–其实也是要先画出预测分析表!!



LL(1)的自上向下的非递归预测分析法:
也是用预测分析表
但是后面加的是自动机


算了没必要纠结这么多细节







SDT模块





2023.4.10



这个a[t2]因为沿着走B2B3B4B6,把x=a[t2]换成x=t3一定没毛病,因为t3在过程中没有变,并且a[t2]在过程中也米有变,所以a[t2]在B6处是全局公共子表达式
但是B6处把t14=a[t1] 换成 t14 = v就会出错(B5会改变a[t1]),
a[t1]在过程中可能变了,虽然v没有变
所以a[t1]不是公共子表达式

此处不能删除x = t3
这个x是他自己写的int x又不是我生成的ti
错了两次,10分钟内错两次~
但是使用复制传播之后可以删除x了
因为认定:编译器可以帮程序员优化他的垃圾程序代码


小心S->`SS+每次从自己又要跳出来多几个展望符号
整理易错点
机器无关优化:针对的是中间代码
及其相关优化:针对的是目标代码

这玩意错两次

句型—是过程中的任意一个符号串
句子:是全是终结符,没有非终结符的句型
句柄:最左直接短语

文法:G=(VT,VN,P,S)===
- 终结符集合
- 非终结符集合
- 产生式集合
- 开始符号
产生式:S->aSA

候选式:
比如E->(E),指的是(E)
找出流图中的循环
这找的是自然循环:不是平常的循环,要用回边+画画树找
2,3,4,5一个循环
3~4一个循环
选填
display表

