首页 > 其他分享 >编译原理 第六章&编译原理必考大题: 语义分析及中间代码生成&必考大题语句翻译

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

时间:2024-07-03 21:00:43浏览次数:19  
标签:语句 代码生成 翻译 循环体 goto 必考 四元 编译 6.3

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

文章目录

写在最前

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

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=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语句的翻译

先看一个例子

翻译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

相关文章

  • 编译Open Cascade(OCC)并使用C#进行开发
    说明:VS版本:VisualStudioCommunity2022系统:Windows11专业版23H2OpenCASCADE:v7.7.0(链接:https://pan.baidu.com/s/1-o1s4z3cjpYf5XkwhSDspQ?pwd=p9i5提取码:p9i5)下载和安装OCCDownload-OpenCASCADETechnology​​​安装MSVC​打开文件夹“C:\OpenCASCADE-......
  • centos系统构建安装john导致的编译问题error: size of array element is not a multip
    blake2.h:112:5:error:sizeofarrayelementisnotamultipleofitsalignment112|blake2b_stateS[4][1];|^~~~~~~~~~~~~blake2.h:113:5:error:sizeofarrayelementisnotamultipleofitsalignment113|blake2b_stateR[1];......
  • 探索Mojo语言的编译器优化:提升性能的秘诀
    ......
  • VSCode + Qt + QMake 开发编译环境搭建
    鉴于Qt官方IDE太过难用,VSCode+各种插件功能强大,遂采用VSCode来写Qt项目;本博客在Windows平台进行指导操作,Mac、Linux平台配置方式类似,学习其本质就可。前置准备VSCode,最新版本即可本地Qt环境,版本随意,本文主要针对较老版本使用Qmake构建系统的项目环境变量Qt环境变......
  • Vscode编译Keil ARM工程出现未定义标识符的解决办法
    点击拓展c/c++的拓展设置搜索:intellisenseengine更改为如下图设置设置解释:1.C_Cpp:IntelliSenseEnginedefault(默认):此选项表示使用默认的IntelliSense提供程序,这通常是FullIntelliSense模式。它提供最完整和精确的代码补全、错误检查和导航功能,但可能会占用更多的......
  • 【ORB_SLAM的安装报错】—— 使用./build.sh编译ORB_SLAM源码时出现报错:/usr/bin/ld:
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、/usr/bin/ld:找不到-lboost_serialization1.问题描述2.解决(1).下载源码(2).编译安装总结前言Boost库是一组由C++标准库的扩展库组成的集合,旨在为C++开发者提供高质量和功能丰......
  • golang 构建标签(go:build)条件编译
     //go:build是Go语言(golang)中的一种构建标签(buildtag),用于控制源代码文件在特定条件下是否被编译。这个注释标记允许你在同一个包内编写针对不同平台、操作系统或编译条件的代码。当gobuild或gotest等命令执行时,它们会检查这些标签来决定哪些文件应该包含在构建过程中......
  • python编译器
        Python解释器安装配置下载    第一,搜索python官网WelcometoPython.orgTheofficialhomeofthePythonProgrammingLanguagehttps://www.python.org/   第二,进入此页面PythonReleasesforWindows|Python.orgTheofficialhomeofthePyth......
  • C++编译问题,解决arm下链接静态库,引起的relocation R_AARCH64_ADR_PREL_PG_HI21 agains
    显示的完整错误如下:relocationR_AARCH64_ADR_PREL_PG_HI21againstsymbol`ZN2c43yml9free_implEPvmS1'whichmaybindexternallycannotbeusedwhenmakingasharedobject;recompilewith-fPIC根据提示,在链接.a静态库时,应该在编译时加上参数-fPIC然而CMake文件中已......
  • 编译安装Kubernetes 1.29 高可用集群(7)--Metrics Server节点监控配置
    1.部署MetricsServer节点监控1.1在任意k8s-master节点上下载MetricsServer的创建文件https://github.com/kubernetes-sigs/metrics-server/releaseswgethttps://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml1.2修改单机版配置......