第六章 语义分析及中间代码生成&必考大题语句翻译
文章目录
写在最前
本章要掌握内容不多,重点在于掌握语句的翻译,该部分为大题部分,其余部分为小题挖空。
6.1 语义分析
词法分析----->识别单词类码和值
语法分析----->识别句子,发现语法错误
语义分析----->发现语义分析
检查各个语法结构的静态语义
(1)类型检查
(2)控制流检查
(3)唯一性检查
(4)关联名检查
中间代码生成:便于实现编译程序,移植,代码生成
代码优化:生成高质量的目标程序
目标代码生成
- 绝对指令代码
- 可重定位的机器指令代码
- 汇编指令代码
6.2 中间代码
用于编译程序
- 源程序经过语义分析被译成中间代码序列
用中间语言过渡的好处
- 便于编译系统的实现,移植,代码优化
常用的中间语言:
- 后缀式:逆波兰式
- 三地址码数:(四元式)
- 语法结构树(三元式)
6.2.1 逆波兰式
逆波兰式:特点:表达式中各个运算符出现的顺序进行的,故无需使用括号来指示运算顺序,因而又称为无括号式。
6.2.2 四元式
四元式是一种更接近目标代码的中间代码形式,由于这种形式的中间代码便于优化处理,因此,在目前的许多编译程序中得到了广泛的应用。
四元式一般形式为(op,arg1,arg2,result)
简化四元式:result=arg op arg2
一般形式为:(+,a,b,t) (j>,a,b,100)
简化四元式:t=a+b if a>b goto(100)
当op为一元,零元运算(如无条件转移)时,arg2 甚至arg1 应缺省
(j,-,-,100) goto(100)
每个四元式只能有一个一个运算符,所以,一个复杂的表达式只能由多个四元式构成的序列表示。
例如,表达式 A+BC写为序列
T1=BC T2=A+T1
6.2.3 三元式
为了节省临时变量的开销,有时也可采用一种三元式结构作为中间代码,其一般形式为(op,arg1,arg2)
三元式比四元式更能节省存储空间,但不利于优化
6.3 语句翻译(必考大题)
本小节,为必考大题,单独写一篇博客,进行系统的讲解。
掌握语句翻译,要循序渐进学习,先学习布尔表达式的翻译,再学习
6.3.1 布尔表达式的翻译
约定:各类运算符的优先顺序(由高到低)如下:
1.括号
2.算术运算符 *,/,+,-
3.关系运算符 <,<=,=,>,>=<,<>
4.逻辑运算符 与或非
直接看代码实例:
不难看出 引入了 goto Etrue作为真出口, goto Efalse作为假出口。
学会上述的表达布尔表达式的写法
6.3.2 if语句的翻译
先看一个例子
翻译if a<b then a=a+1
100 if a<b goto 102
101 goto 104
102 t=a+1
103 a=t
104 if后语句
注意的点:
if语句后面的那句,要留出来,goto到后面
每一句的语句不能很复杂,四元组的简化形式
104句中 if后语句,是简略写法,方便理解,做题不能这么写
再看一个例子
翻译if a<b then a=a+1 else a=a-1
100 if a<b goto 104
101 t=a-1
102 a=a-1
103 goto 106
104 t=a+1
105 a=t
106 下一句
上面这个例子是不完全正确的,因为计算机需要goto来明确下一步跳转,实际的问题中,很可能跳转很可能比较乱,需要我们死板的规定
修改后
100 if a<b goto 102
101 goto 105
102 t=a+1
103 a=t
104 goto 107
105 t=a-1
106 a=t
107 if下一句
注意翻译if,从左往右正常翻译,不要先翻译else后语句
if下一个句子要是一个goto
练习:翻译 if a<b or a<c then a=a+1 else a=a-1
100 if a<b goto 104
101 goto 102
102 if a<c goto 104
103 goto 107
104 t=a+1
105 a=t
106 goto 109
107 t=a-1
108 a=t
109 if后语句
6.3.3 while语句翻译
while E do 循环体 翻译模版
if E goto 循环体
goto 出循环体
循环体
goto 回到循环体的判断语句
循环体的下一句(也是goto出循环体)
先看一个例子
实战训练
练习1:
翻译 while AVB<C do m=m+1
100 if A goto 104
101 goto 102
102 if B<C goto 104
103 goto 107
104 t=m+1
105 m=t
106 goto 100
107 下一条
练习2:
翻译 if ac then a=a+1 else a=a-1
100 if a<b goto 102
101 goto 107
102 if a>c goto 104
103 goto 107
104 t=a+1
105 a=t
106 goto 109
107 t=a-1
108 a=t
109 goto if下一句
标签:语句,代码生成,翻译,循环体,goto,必考,四元,编译,6.3
From: https://blog.csdn.net/weixin_62613321/article/details/140119240