语法制导翻译
语义分析的作用
- 检查结构正确的句子表达的意思是否正确
- 执行规定的语义动作
中间代码简介
后缀式
逆波兰式,a+bc的后缀式表示为abc+操作符紧跟在操作数的后面
三地址码
三地址码式不超过三个地址组成的一个运算,他与汇编指令在结构上十分接近,从三地址码生成目标代码比较容易,因此作为中间代码
三地址码的实现借助三元式和四元式
三元式的表示为
(op,arg1,arg2)
它表示的计算为:=arg1 op arg2
例如表达式x:=a+bc用一组三元式表示的结果为
(1)(,b,c)
(2)(+,a,(1))
(3)(:=,x,(2))
四元式的表示为
(op,arg1,arg2,result)
四元式的意义在于用result临时存储运算结果,方便语法制导翻译时引入临时变量
如何从树到三地址码?或者从三地址码到树?
符号表
符号表用于存放声明的变量,比如int x;符号表中存储的不仅仅是变量的名字,还有变量的类型,作用域,符号表会为这样的x建立两个条目int x;struct x{double y,z};
声明语句的翻译
数组元素的引用
如何计算某个n维数组元素的地址?
a-cw+vw
其中a是首地址,w是每个元素占用的存储单元,二维数组下,d在按行存储时是i1的最大值,按列存储时是i2的最大值
例题
根据二维数组元素的地址计算公式arr+[(2-1) × 4+(3-1)] ×d=arr+6d
数组元素引用的语法制导翻译
中间代码生成的好处主要有两点:一是便于编译程序的开发和移植; 二是便于对代码进行优化处理。 特点:便于语法制导翻译;既与机器指令的结构相近, 又与具体机器无关。
布尔表达式
布尔表达式的计算可以采用数值表示的直接计算和逻辑表示的短路计算两种方式
拉链与回填
拉链-回填技术是语法制导翻译过程中使用的一种基本技术,其基本思想是当三地址码中的转向不确定时,将所有转向同一地址的三地址码拉成一个链,而一旦所转向的地址被确定,则为此链上所有的三地址码回填入此地址