编译原理2024期末复习(面向做题,大题速学)下篇【太原理工大学】

本文详细介绍了逆波兰式、三元式和四元式的书写方法,强调了根据运算优先级和逻辑顺序的重要性。同时讨论了代码优化的五个常用技术,如合并常量运算、删除无用赋值等,并通过实例展示了如何在编译原理中应用这些概念。
摘要由CSDN通过智能技术生成

书接上回,还剩下三元式,四元式,逆波兰式以及代码优化没有写。

16.逆波兰式,三元式,四元式的书写

知识点:转移操作有四个:BL转向某标号(用的少)BT条件为真转 BF条件为假转 BR无条件转

16.1逆波兰式的书写
做题思路:

        就是运算符在操作数的后面,比如 a-b的逆波兰式就是ab-,长一点的就是 (7 - 4) * 2,对应的逆波兰式为:7 4 - 2 * 。要注意的是,计算逆波兰式要根据优先级来计算,像是先小括号,在乘除在加减,要注意顺序。

        要注意的是逆波兰表示时前面的序号与逆波兰式长度有关,一个字母或者一个符号表示一个长度。

条件语句的逆波兰式表示

注意:每一次进行判断后,后面紧跟的一句必定是BF跳转,跳转语句后接着是判断为true的执行语句。你可以这样想,你写的这个语句就相当于是这个程序的执行顺序,它每一句的执行都是符合逻辑的,你如果条件判断正确是不会执行条件判断错误时的语句的,同理相反也是一样的。所以在你写完你的句子时,你可以附一个初值自己执行一下自己写的,看会不会走到不该执行的语句上,如果没有证明你的句子写对了。按照这样的逻辑写,写这些语句就不会生搬硬套了,写的也就更快更准确了。不止条件语句的书写,像程序段,循环语句的逆波兰式表示,甚至是三元式四元式的书写也是这样的,只要按着执行的逻辑去书写,就会下笔如有神了。当然基本的书写格式要掌握!

程序段的逆波兰式表示

 

循环语句的逆波兰式表示

这块要注意的是,因为是循环语句,所以只有条件判断为假时才跳出循环,并且每次执行过后要记得判断条件要自增(i++),然后无条件BR跳转到判断语句那块,同样的,判断语句下面紧跟的就是BF跳转,这是一样的,剩下的和上面就是一样的了。
 

16.2四元式的书写

知识点:四元式的表示为(运算符,分量1,分量2,运算结果)

                赋值的话:a:=4(:=,4,_ ,a)

                -b(-,b,_,T1)

                转移操作的写法略有不同:无条件转到A(BR,A,_,_)B为true时转到 A                  (BT,A,B,_)B为false时转到A(BF,A,B,_)A为跳转的序号(不用加括号),这块写时的序号是递增的,与逆波兰式不同(逆波兰式是根据长度走的)

注意:像赋值语句的话,有一种情况是 i=i+1,有两种写法(+,i,1,i)这个就是把i+1的结果直接赋值给i,还有一种是分两步写(+,i,1,T1)(=,T1,_,i)我们老师上课推荐的是这种写法。

举两个例子:

条件语句的四元式表示 

程序段的四元式表示  

             

 循环语句的四元式表示

我觉得可转可不转吧,要是能直接写出四元式,就不用转了。 

16.3三元式的书写

知识点:

知识点:三元式的表示为(运算符,分量1,分量2)

                赋值的话:a:=4(:=,4,a )

                -b(-,b,_)

                与四元式的区别就是没有了运算结果的表示,所以在调用该条的运算结果时是调用该语句的序号。

                转移操作的写法略有不同:无条件转到A(BR,A,_)B为true时转到 A                  (BT,A,B)B为false时转到A(BF,A,B)A为跳转的序号(不用加括号),这块写时的序号是递增的,与逆波兰式不同与四元式相同(逆波兰式是根据长度走的)

 举个例子:

 条件语句的三元式表示 

 程序段的三元式表示 

 循环语句的三元式表示 


17.代码优化 

有五个常用的优化技术:

1.合并常量运算

就是将能算出来的先算出来当为已知值。

2.删除无用赋值

就是没有使用的句子不用写。

 

3.削减运算强度

就是把乘法运算换算成加减法运算 

4.删除多余运算 

就是公共子表达式计算过一次,后面需要写时直接用,不用再写一遍。

5.外提不变表达式

就是循环中每次循环保持不变的提到循环外,减少循环中计算的次数。 


书上的例题8.7就很好,里面包含了许多种优化。

 做题思路:

        其实就是看它给的循环语句,找有没有能优化的点,然后我们就会发现它是一个双重循环,外面循环执行一次,里面执行i+1次,所以就会发现,其实里面循环执行的判断条件是不变的,因为i是外层循环确定的,所以里层循环的判断条件就可以执行外提不变表达式,将i+1放到外层循环中,然后再看内层循环会发现第一句x=i+a没有用,所以删除无用赋值将这句删掉。接下来一句会发现i*a是固定的所以也执行外提不变表达式,提到外层循环中,里面直接调用就行,然后看第三句会发现一部分与第二句一样,所以我们不用在写一遍,直接调用第二句的结果删除多余运算了。像里层循环执行完一遍后外层循环不是要+1嘛,也可以调用之前定义的i+1语句,删除了多余运算。剩下的步骤语句就是正常了。

        下面是我写的答案,不知道正不正确,供参考:


 然后编译原理的大题部分就完结撒花了!一共写了快8个小时,我也不知道为啥这么废时间。
这算是编译原理的下篇吧,上篇在这!
  希望大家都高过,咱们有缘再见吧!

  • 26
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村口下棋刘师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值