编译原理之内容补充以及题型整理

代码优化

优化的分类:

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

机器相关优化:针对目标代码

局部代码优化:单个基本块范围内的优化

全局代码优化:面向多个基本块的优化

常用优化方法:

删除公共子表达式

如果表达式xopy已经被计算过,且到现在变量值未改变,称为公共子表达式,可以将他删除,避免重复计算

我们发现,t7和t10是重复计算的,而且变量值没有改变,叫做公共子表达式

同时,t2到t6的i也没有改变,t4到t8的j也没有改变,因此可以将t6和t8删除

删除无用代码

删除无用代码

复制传播:在复制语句x = y后尽可能的用y代替x

更改后,x = t3没有在本块中使用,也没有在其他块中使用,成为了无用代码,可以删除

常量合并

推导出一个表达式的值是常量,运用常量来代替这个表达式

代码移动

不管循环执行多少次都得到相同的表达式移动到循环之外

强度削弱

用较快的操作代替较慢的操作,+代替*,-代替/

删除归纳变量

归纳变量步调一致,可以删除为一个

基本块的优化(局部优化)

先把一个基本块转换为一个无环有向图(DAG)

从DAG上删除所有没有附加活跃变量的根节点,可以消除无用节点进而删除无用代码

题型补充

1.正则表达式转NFA

特殊的,如果R = A*,可以写成如下形式,*代表可能有任意个A

如果R = (A | B)*,表示方法为

2.NFA转换为DFA

先把正规式转换为NFA,再把NFA转换为DFA,最后进行最小化

转换NFA到DFA的方法是列表,看可以输入什么,从头开始看,将可以相通的放在一起即可

例如,我们转换好的NFA假设如下

现在我们从起点开始,进行构建

可以互通的就放在一起,最后I中的式子就是我们新的节点,然后就可以的出来了

3.NFA的最小化

进行状态的划分,把相同的状态分为一类,例如上图的1,3,4都是终止状态,就可以放在一起,最后得出结果

4.LL(1)文法

消除左递归(直接消除左递归,提取左因子),计算First集和Follow集,对于一个式子可以推出多种结果的式子进行分析,满足交集为空,即为LL(1)文法

例题:

本题目不需要消除左递归,因此直接求First和Follow集

判断是否为LL(1)文法,可以列出LL(1)表格,如果对应的只有一个式子,就是LL(1)文法,或者可以求SELECT集合,判空集

给出LL(1)文法让我们输入字符串分析

4.LR(0)自动机

A → aAd | aAb | ε 

文法增广

构造自动机

LR(0)分析表如下

有重复内容,不是LR(0)文法,因此我们需要构建SLR(1)分析表

5.SLR(1)分析表

求左式的Follow值

写表

6.对输入串进行LR(0)或者SLR(1)分析

7.短语,直接短语,句柄

 G[E]:

E→E+E | T

T→T*F | F

F→i | (E)

求T*F + i的短语,直接短语,句柄

8.三地址码

 x+y*z 这样的源语言表达式要被翻译成

t1 = y*z;
t2 = x + t1;
x = t2;

​​​​​​​

  • 34
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值