当把一个句型的语义分析完毕的时候,如果符合规则,就会生成中间代码或者是目标代码来供机器识别,那具体过程机遇是第七章讲的内容。
一、几种常用的中间语言形式
1.1 逆波兰表示法
a+b → ab+
a*(b+c) → abc+*
-a+b*c → a@bc*+
1.2 图表示法
抽象语法树。
无循环有向图(DAG)
a:=b*-c+b*-c的图表示法
1.3三元式
三元式由三个部分组成:
算符:OP
第一运算分量:ARG1
第二运算分量:ARG2
1.4 四元式
一个四元式是一个带有四个域的记录结构:op,arg1,arg2及result。它实际上就是一条三地址的指令。
有时将四元式表示成更直观的形式-三地址代码
三地址代码形式:
x:=a op b (赋值形式)
二、某些语句的四元式及翻译
2.1说明语句的翻译
程序语言中的说明语句都是给编译程序提供信息的,诸如类型、维数、每维的界种类等,因此一般不生成目标,只是在编译时把有关信息填入相应表格即可。
2.2 赋值语句的翻译
1.简单算术表达式的赋值语句:
所谓简单指不考虑数组元素、记录、函数的引用等情况。
2.3 控制流语句的翻译
可以仿照算术表达式的翻译来进行。
例如 A∨B∧C=D可翻译成如下四元式序列:
(=,C,D,T1)
(∧,B,T1,T2)
(∨,A,T2,T3)
但是对于控制语句中的条件表达式,我们还必须结合控制语句作进一步的分析。
2.4 过程调用的翻译
1. 过程调用主要解决两个问题:
(1)把程序控制转移到子程序(过程段),执行完毕再返回。这个问题很好解决。
(2)传递实在参数。我们前面谈到过几种不同的参数传递方式(传名、传值、传地址),它们的语义动作也就有所区别。
这一章比较重要的是中间代码的表示方式吧,逆波兰,三元式,四元式的表示,还有将程序转换成三元式,四元式,这些一些简单的程序,自己手动转换的时候还是比较较简单的,但是要说起用代码来编写一个转换程序是,应该不算容易的吧,学完编译原理回头复习的时候,真的可以感觉得到编译原理真的是包括了软硬件和算法等等各种知识,是一个大杂烩一样的存在,想吃透它真的可以把所有的知识都学个全面了,但是毕竟不容易,以后有时间真的要好好学学编译原理,一门大课。