一、求后缀表达式
可能就是一填空题,考试应该也不会太复杂,要会,掌握着由外到内求解思想即可;
其实就是二叉树的后序遍历,左右根;拆分的顺序就是由左到右顺序进行,小括号内的最后拆(由外到内);
后面三道的具体步骤就不写了;
二、求三元式
三元式的拆分求解顺序和后缀表达式相反,由内到外;
三元式的形式(运算符,参数1,参数2)
1.三元式:
- 三元式的求解过程是由内到外,然后右左向右,可以发现先拆小括号里面,然后再按顺序向右求解;
- 要盯着三元式的形式去填,(运算符,参数1,参数2),参数当然也可以是一个三元式,比如(2)的第一个参数就是(1);变负数有点特殊,操作符是@,然后第一个参数就是想变负数的参数,第三个参数为空,画一条线即可;
2.间接三元式:
间接三元式其实就是对三元式做一个小改动,通过上图可以发现 (1)、(5)其实是一样的,所以可以把(5)删去,下面用到(5)的可以替换为(1);
三、求四元式
四元式的形式(运算符,参数1,参数2,运算结果(临时变量名))
1. 根据表达式写四元式
以上题的表达式为例,写出其四元式
同理也是盯着四元式的形式(运算符,参数1,参数2,运算结果(临时变量名))去写,和三元式不一样的就是多一列,多了一个运算结果,其实就是个变量,所以他叫四元式;然后三元式引用的(x)换成Tx;别的都一样,
2. 根据代码写四元式(重点)
普通四元式的形式(运算符,参数1,参数2,下一步跳转的地址编号),对于赋值操作的四元式形式:(运算符,参数1,参数2,临时变量);每个四元式的前面有一个地址编号,用于跳转用;
考试要考,要会做!
例题1
- 赋值操作比较特殊,有三步,第一步是进行运算结果存入T,第二步是把运算结果T赋值给想赋值的变量C,第三步就是下一步跳转的地址编号;
- 和上面表达式写的四元式有点不同的是,运算符前面加了个 j,j就是跳转指令;然后第四列的表示含义不同:赋值操作时(运算符为±*/、:=)第四列和上面的四元式一样,表示变量;其他操作时,第四列表示下一步跳转的地址编号;
- 可以发现,四元式对于每一个条件都是成对出现的,当满足某个条件,进行操作后,第四列存储执行完当前操作后的,下一步跳转的地址编号;
- 这里看的答案解析给的是0,默认当做程序跳出;下面一道题,用一种新的写法,对加一个四元式当做程序出口;
例题2
- 地址为109的表示程序出口,上题默认用的0,感觉还是这种写法比较好;
- 需要注意当while后面的C>0没满足时,直接结束程序,而不是再跳到if(A<X),按照正常的程序执行流程来想就可以;上一题是因为,开头就是个While,所以下面的if、else执行完还要跳到程序开始;
- 视频讲解参考:编译原理程序段翻译成四元式序列
例题3
可参考:【编译原理】:如何将控制语句翻译成四元式