本章要掌握内容不多,重点在于掌握语句的翻译,该部分为大题部分,其余部分为小题挖空。
词法分析----->识别单词类码和值
语法分析----->识别句子,发现语法错误
语义分析----->发现语义分析
检查各个语法结构的静态语义
(1)类型检查
(2)控制流检查
(3)唯一性检查
(4)关联名检查
中间代码生成:便于实现编译程序,移植,代码生成
代码优化:生成高质量的目标程序
目标代码生成
用于编译程序
用中间语言过渡的好处
常用的中间语言:
逆波兰式:特点:表达式中各个运算符出现的顺序进行的,故无需使用括号来指示运算顺序,因而又称为无括号式。
四元式是一种更接近目标代码的中间代码形式,由于这种形式的中间代码便于优化处理,因此,在目前的许多编译程序中得到了广泛的应用。
四元式一般形式为(op,arg1,arg2,result)
简化四元式:result=arg op arg2
一般形式为:(+,a,b,t) (j>,a,b,100)
简化四元式:t=a+b if a>b goto(100)
每个四元式只能有一个一个运算符,所以,一个复杂的表达式只能由多个四元式构成的序列表示。
例如,表达式 A+B*C写为序列
T1=B*C T2=A+T1
为了节省临时变量的开销,有时也可采用一种三元式结构作为中间代码,其一般形式为(op,arg1,arg2)
三元式比四元式更能节省存储空间,但不利于优化
本小节,为必考大题
掌握语句翻译,要循序渐进学习,先学习布尔表达式的翻译,再学习
约定:各类运算符的优先顺序(由高到低)如下:
1.括号
2.算术运算符 *,/,+,-
3.关系运算符 <,<=,=,>,>=<,<>
4.逻辑运算符 与或非
直接看代码实例:
不难看出 引入了 goto Etrue作为真出口, goto Efalse作为假出口。
学会上述的表达布尔表达式的写法
先看一个例子
翻译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后语句
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 a<b and a>c 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下一句
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。