前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编译原理 第六章 : 语义分析及中间代码生成&&语句翻译

编译原理 第六章 : 语义分析及中间代码生成&&语句翻译

原创
作者头像
小徐在进步
发布2024-09-26 21:15:03
3710
发布2024-09-26 21:15:03
举报
文章被收录于专栏:编译原理

第六章 语义分析及中间代码生成&必考大题语句翻译

写在最前

本章要掌握内容不多,重点在于掌握语句的翻译,该部分为大题部分,其余部分为小题挖空。

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+B*C写为序列

T1=B*C 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语句的翻译

先看一个例子

代码语言:c
复制
翻译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后语句,是简略写法,方便理解,做题不能这么写

再看一个例子

代码语言:c
复制
翻译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来明确下一步跳转,实际的问题中,很可能跳转很可能比较乱,需要我们死板的规定

修改后

代码语言:c
复制
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

代码语言:c
复制
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 循环体 翻译模版

代码语言:c
复制
if E goto 循环体
goto 出循环体
循环体
goto 回到循环体的判断语句
循环体的下一句(也是goto出循环体)

先看一个例子

实战训练

练习1:

翻译 while AVB<C do m=m+1

代码语言:c
复制
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

代码语言:c
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第六章 语义分析及中间代码生成&必考大题语句翻译
  • 写在最前
  • 6.1 语义分析
  • 6.2 中间代码
    • 6.2.1 逆波兰式
      • 6.2.2 四元式
        • 6.2.3 三元式
        • 6.3 语句翻译(必考大题)
          • 6.3.1 布尔表达式的翻译
            • 6.3.2 if语句的翻译
              • 6.3.3 while语句翻译
                • 实战训练
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档