编译系统笔记

重点

有三个部分需要认真看:

  • LL文法类与LR文法类
  • image-20230501164027165
  • 中间代码生成(语义动作等)
  • 三大数据流分析+自然循环分析
  • LL/LR文法分析是核心内容,繁琐但是不难,认真做一遍题即可。
    中间代码生成需要按PPT模板写,所以每道题都有固定答案,包括临时变量名,跳转Label标号,总行数等。
    中间代码需要记模式,而不是模板,不然就只能死记硬背了。
    四元式比较简单,变下形就可以。
    数据流分析很抽象,时间充裕的话可以看看spoc,推荐期末复习讲座认真听一下,看看各位佬手推分析过程。
    其他部分,推荐直接做题,不会的地方再看PPT,最后再看spoc

1)画一个简单的DFA

2)LL(1)构造、画表

3)LR(1)构造、画表

4)修改左递归文法,然后重新设计一个SDD(今年是求二进制数的十进制数值)

5)符号表以及非局部数据访问(访问链)和嵌套深度的考察、

6)三元式的生成和基本块划分、流图、自然循环、支配结点、以及DAG图。

所以大家复习时,一定重点关注这些内容,尤其最后一题中间代码生成代码优化部分的内容,如果中间代码生成出错了,接下来基本没分了..今年这道题是28*0.7分,分值还是相当大的。

第一章image-20230430100936881

词法分析:

​ 对构成源程序的字符扫描

语法分析:

​ 建立语法树

语义分析:

​ 检查是否合法

代码优化:
目标代码生成:

第二章

文法:image-20230430101309579

产生式:

image-20230430101353631

句型:

可以含有非终结符

句子:

是必须全为终结符了

image-20230430101545647

语言:

image-20230430101603775

文法类型:

image-20230430101708128

image-20230430101804328

词法分析

image-20230501152414926

image-20230501153211242

image-20230501153230459

image-20230501153258101

4.5

image-20230501160347236

image-20230501160752864

image-20230501160907377

自下向上

image-20230501163542242

LR(0)

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

image-20230501165542816

SLRimage-20230501202545710

image-20230501225638684

LR(1)

image-20230503223924936

LR(0)与SLR与LR(1)的rj对比

SLR

只在follow对应的写rj

image-20230503225239806

image-20230503225247503

LR(1)

只在S->L·,a

根据a来写rj位置

image-20230503225358742

image-20230503225406046

语法制导翻译

综合属性:image-20230504102312522

继承属性

image-20230504102402200

tips

image-20230504103917916

一眼看出综合属性

image-20230504104516443

一眼判断LSDD

image-20230504105810709

SDTimage-20230504110638483

LSDD->SDT

image-20230504111120018

image-20230507222438803

image-20230507225831652

中间代码生成

定义语句翻译

主要是通过type和width确定相对位置offset

赋值语句翻译

image-20230504214747040

image-20230504215204418

image-20230504215303150

增量方法中:

image-20230504215521080

四元式

image-20230505000411158

image-20230505000445497

存储分配

image-20230508171750049

代码优化

基本块的划分

找首指令

如何划分首指令:

1.第一个三地址指令

这里的B1就是三地址指令

image-20230508211709429

2,,跳转指令结束之后的指令

3,跳转指令的目标指令

image-20230505002152498

划分

image-20230505095346880

image-20230505095357831

优化分类

重点学习无关优化

image-20230505095438928

公共子表达式

image-20230505095609678image-20230505095712987

image-20230505101028177

image-20230505101119245

image-20230505103144814

数据流

分析gen与kill

gen是本块定义的变量

kill是程序中所有其它对*定义y变量

image-20230508230528362

活跃变量分析

image-20230507083057452

可用表达式

image-20230507083252521

image-20230507083736221

image-20230507083715962

支配节点

image-20230507083849265

image-20230507084002467

回边

image-20230507084101860

自然循环

image-20230507084240066

删除公共子表达式

image-20230507084641307

删除复制语句

image-20230507084802225

代码移动

image-20230507084934646

归纳变量

image-20230507092217483

image-20230507092414625

归纳变量的删除

image-20230507092539964

image-20230507092819603

image-20230507092853597

代码生成器

image-20230507093844437

错题

image-20230508210011876

image-20230508210026688

image-20230508210221179

image-20230508210228436

image-20230508210342968

image-20230508211148041

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

image-20230508214659413

2023.4.9错题

image-20230509140120641

image-20230509140135406

这个S->a|S+S|SS都要提取公因子

并且提取公因子我也做错了

image-20230509142437441

image-20230509144839182

或许需要对¥的符号进行特殊处理

LL(1)自上向下的递归预测分析法——–其实也是要先画出预测分析表!!

image-20230510140612575

image-20230510140450427

image-20230509144950167

LL(1)的自上向下的非递归预测分析法:

也是用预测分析表

但是后面加的是自动机

image-20230510140756408

image-20230509163624717

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

image-20230510141349876

image-20230510141359698

image-20230509163700431

image-20230509185837066

image-20230509190425737

image-20230509200101771

image-20230509211625929

SDT模块

image-20230509215639148

image-20230509215650316

image-20230509215700182

image-20230509215711447

image-20230509215727450

2023.4.10

image-20230510095921953

image-20230510100509903


image-20230510142712590

这个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]不是公共子表达式


image-20230510144046049

此处不能删除x = t3

这个x是他自己写的int x又不是我生成的ti

错了两次,10分钟内错两次~

但是使用复制传播之后可以删除x了

因为认定:编译器可以帮程序员优化他的垃圾程序代码


image-20230510154930766


image-20230510155235470

小心S->`SS+每次从自己又要跳出来多几个展望符号


整理易错点

机器无关优化:针对的是中间代码

及其相关优化:针对的是目标代码


image-20230510104218876

这玩意错两次


image-20230510104652978

句型—是过程中的任意一个符号串

句子:是全是终结符,没有非终结符的句型

句柄:最左直接短语

image-20230510104426864

文法:G=(VT,VN,P,S)===

  • 终结符集合
  • 非终结符集合
  • 产生式集合
  • 开始符号

产生式:S->aSA

image-20230510104803753

候选式:

比如E->(E),指的是(E)


image-20230510110027340找出流图中的循环

这找的是自然循环:不是平常的循环,要用回边+画画树找

2,3,4,5一个循环

3~4一个循环


选填

display表

image-20230510112731794

image-20230510112945000


编译系统笔记
http://yoursite.com/2023/05/15/编译原理期末笔记/
作者
Fars
发布于
2023年5月15日
许可协议