当前位置: 首页 > news >正文

【编译原理复习笔记】中间语言

中间语言

中间语言的特点和作用

(1)独立于机器
(2)复杂性介于源语言和目标语言之间
中间语言可以使编译程序的结构在逻辑上更为简单明确

常用的中间语言

后缀式
图表示:抽象语法树,有向无环图
三地址代码:三元式,四元式,间接三元式

后缀式

(1)若 E 为单独的变量或常量,则其自身就为后缀式
(2)若 E 为 E1 op E2 的形式,则其后缀式为 E1’ E2’ op,其中前两项对应了各自的后缀式
(3)若 E 为(E1)形式,则 E 的后缀式为 E1 的后缀式
优点:
后缀式不用使用括号
自左向右扫描后缀式,每碰到运算量就推进栈,遇到 k 目运算符时就计算栈顶的 k 个项目

图表示法

(1)抽象语法树
(2)有向无环图 DAG
对于表达式中的子表达式,DAG 中都有一个结点
一个内部结点表示一个操作符,其子节点代表操作数
在一个 DAG 中代表公共子表达式的节点有多个父节点
在这里插入图片描述

三地址代码

可以看作前两种方法的相线性表达方法
三地址:结果,第一操作数,第二操作数
而且三地址代码的复杂程度也与抽象语法树和有向无环图的复杂程度相关
在这里插入图片描述

三地址代码语句的种类

赋值语句
操作语句(双操作数,单操作数)
goto 语句
传参语句
返回语句
等等

四元式

将每个三元式都表示为带有四个域的记录结构,分别为 op,arg1,arg2,res

三元式

三元式不储存 res,用序号来表示 res

间接三元式

三元式表+间接码表
间接码表:一张指示器表,按运算的先后顺序列出有关三元式在三元式表中的位置,节省空间
在这里插入图片描述

在格外添加间接码表,此后再修改时只需要修改间接码表,这个三元式表就不用变动

赋值语句的属性文法

赋值语句的形式:
i d : = E id:=E id:=E
赋诗语句的 S 属性文法
非终结符 S 有综合属性 S.code,代表赋值语句的三地址代码
E 有两个属性
E.place 表示存放 E 的单元的地址
E.code 表示对 E 求值的三地址语句
在这里插入图片描述

赋值语句的翻译模式

在这里插入图片描述
在这里插入图片描述

数组元素地址计算

设 A 为 n 维数组,按行存放,每个元素宽度为 w
l o w i low_i lowi为第 i 维 的下界
u p i up_i upi为第 i 维的上界
n i n_i ni为第 i 维的个数
b a s e base base为 A 的基准坐标(第一个元素地址)
在这里插入图片描述

红色为可变部分,蓝色为固定部分
在这里插入图片描述

带数组元素引用的赋值语句翻译

十分复杂,建议直接观看视频:
哈工大编译原理 P6-4

赋值语句中类型的转换

(1)在运算符中带上类型信息
(2)新增加类型转换运算符
(3)用 E.type 表示非终结符 E 的类型,并增加类型检查
在这里插入图片描述

如果两者类型不同时对应的语义动作:
在这里插入图片描述

布尔表达式

E → E o r E ∣ E a n d E ∣ n o t E ∣ ( E ) ∣ i r e l a t i o n o p i ∣ i E \to E\\ or \\ E|E\\ and\\ E|not\\ E|(E)|i \\ relationop \\ i|i EEorEEandEnotE(E)irelationopii均为布尔表达式
计算布尔表达式的两种办法:
(1)数值表示法
true 为 1,false 为 0
(2)带优化的翻译法、
可以节省计算过程
e.g.
A a n d B = > i f A t h e n B e l s e F a l s e A and B => if A then B else False AandB=>ifAthenBelseFalse
如果采用数值表示法,那么 B 的真伪是必须要进行计算的,但是采用这种方法时,A 一旦为 false 就不用在计算 B

按数值表示法进行翻译

a or b and not c
T1:=not c
T2:=b and T1
T3:=a or T2
nextstate 用来记录下一条三地址语句的位置,方便 emit 来输出三元式
在这里插入图片描述

带优化翻译布尔表达式

对于语义函数 newlabel,返回新的符号标号
对于一个布尔表达式,设置两个继承属性,E.true 是其为真时的控制流跳转符号
E.false 是其为假时控制流跳转符号
E.code 记录 E 生成三地址代码
在这里插入图片描述

一遍扫描的布尔表达式

以四元式为中间语言,使用 emit 将其送入输出数组
难点:产生四元式时转移地址无法立刻知道,只有知道了后续状态才能回填跳转状态
总的来说,一共有两种跳转可能,一种为“真”,一种为“假”,把这些未完成的四元式作为语义值保存,到合适的位置回填
在这里插入图片描述

引入语义变量:
nextquad:指向下一条产生四元式的地址
makelist:创建一条长度为 1 的链,对应四元式的下标
merge:合并两条链,指向合并后的链首
backpatch:回填
在这里插入图片描述

控制语句的属性文法

if-then
在这里插入图片描述

双分支 if then else
在这里插入图片描述
while
在这里插入图片描述

相关文章:

【编译原理复习笔记】中间语言

中间语言 中间语言的特点和作用 (1)独立于机器 (2)复杂性介于源语言和目标语言之间 中间语言可以使编译程序的结构在逻辑上更为简单明确 常用的中间语言 后缀式 图表示:抽象语法树,有向无环图 三地址代…...

linux笔记6--shell相关

文章目录 1. 查看当前的shell类型2. ps -f命令3. 父子shell4. 分号在命令里的作用问题:环境变量echo: 5. sleep和jobssleep:jobs:例子:&: 6. 外部命令和内建命令图解外部命令type命令 7. history命令8. alias命令9. 推荐 1. 查看当前的sh…...

链表-线性表的链式表示

链表-线性表的链式表示 #mermaid-svg-ozpXrKnNCyYdqHvN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-icon{fill:#552222;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-text{fill:#552222;stro…...

GNU/Linux - 时区设置

CST China Standard Time 北京时间/中国标准时间 在时区划分上,属东八区,比协调世界时早 8 小时,记为 UTC8 GMT Greenwich Mean Time 格林威治标准时间 是指位于英国伦敦郊区的格林尼治天文台的标准时间,因为本初子午线被定…...

红队攻防渗透技术实战流程:云安全之云原生安全:内核漏洞和版本漏洞

红队云攻防实战 1. 云原生安全 -Docker安全-容器逃逸-版本漏洞1.1 容器逃逸-版本漏洞-runC容器逃逸1.2 实战案例-版本漏洞-runC容器逃逸1.3 容器逃逸-版本漏洞-containerd逃逸1.4 实战案例-版本漏洞-containerd逃逸1.5 Docker安全-容器逃逸-CDK自动化1.6 Docker安全-容器逃逸-c…...

spring状态机实战

一、什么是状态机 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型,是一种概念性机器,它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件,还能取决于各个事件的相对发生顺序。状态…...

Ubuntu系统上安装NVIDIA驱动【笔记】

Ubuntu上安装NVIDIA驱动,您可以按照以下步骤操作: 首先,您需要配置软件源(根据情况配置,否则影响更新和下载速度)。 接下来,您可以按照上一条回答中的步骤来安装新的NVIDIA驱动。首先&#xff…...

生成式AI导论2024-李宏毅

生成式AI导论2024-李宏毅 第0讲: 课程说明第1讲:生成式AI是什么第2講:今日的生成式人工智慧厲害在哪裡?從「工具」變為「工具人」 第0讲: 课程说明 生成式AI的入门课程 第1讲:生成式AI是什么 生成式人…...

跨平台之用VisualStudio开发APK嵌入OpenCV(三)

本篇将包含以下内容: 1.使用 Visual Studio 2019 开发一个 Android 的 App 2.导入前篇 C 编译好的 so 动态库 3.一些入门必须的其它设置 作为入门,我们直接使用真机进行调试,一方面运行速度远高于模拟器,另一方面模拟器使用的…...

渗透测试框架之CobaltStrike,Metasploit域名上线隐藏IP

概述 为什么要隐藏IP 在拿下了目标机之后,目标机在内网里面,使用msf或者CS时,用自己的VPS做服务器的话,导致很容易被溯源。 域名上线原理 当我们访问域名时会经过域名解析 域名解析就是域名到IP地址的转换过程,那么…...

vue.js对接海康威视摄像头web开发包

一、登录海康开放平台下载web开发包,下载需要先登录海康账号,没有的需先注册一个。 这里的appkey、ip、port、secret 和cameraIndexCodeasd是自己去申请的 appkey: "****", ip: "****", port: **, secret: "****", //必填…...

Selenium中使用的三种等待

文章目录 1.前言2.在selenium中常见的等待操作一般有3个 1.前言 在使用selenium时很多元素在使用的时候都需要加载,如果不等待加载结束直接使用就会报错,功能不能继续。一般解决的办法就是使用等待操作。 2.在selenium中常见的等待操作一般有3个 slee…...

推荐一款媒体影音嗅探神器—Chrome扩展插件(猫抓cat-catch)

目录 1.1、前言1.2、下载地址1.3、github Releases 版本说明1.4、安装步骤1.5、猫抓插件常规设置1.5.1、设置抓取文件的类型1.5.2、设置抓取文件的后缀名 1.1、前言 我们在日常上网的过程中,很多音频、视频网站下载资源都非常不方便,要么需要安装客户端&…...

LLaMA-Factory 微调训练

LLaMA-Factory 微调训练 该框架功能,标注-微调-导出-合并-部署,一整条流程都有,而且训练时消耗的gpu算力也会小一些 一,安装(推荐在linux中训练,win可以用wsldocker) git clone https://githu…...

阿里云ECS服务器怎么设置时区

在自己部署在阿里云服务器上的应用中,控制台打印的日志时间和本地不一致,于是决定修改阿里云服务器的时区为Asia/Shanghai。 具体操作如下: 第一步:连接服务器 通过finalshell等连接工具通过公网IP连接到服务器。 第二步&#…...

【698协议】帧校验算法

698协议,帧校验算法 帧格式 帧校验范围 校验算法 #include "fcs16.h" /* * u16 represents an unsigned 16-bit number. Adjust the typedef for * your hardware. * Drew D. Perkins at Carnegie Mellon University. * Code liberally borrowed from M…...

FileZilla“服务器发回了不可路由的地址,使用服务器地址代替

问题:在宝塔创建的FTP无法使用,提示“服务器回应不可路由的地址。使用服务器地址代替 第一种解决办法:由于宝塔把FTP被动模式端口范围设置成了39000-40000,所以只需要把阿里云服务器上相应的端口范围开放即可。 第二种解决办法&am…...

【路径规划】基于遗传算法GA实现最短距离 多起点多终点多旅行商问题求解附Matlab代码

基于遗传算法GA实现最短距离 多起点多终点多旅行商问题求解 研究背景:研究步骤:研究方法和技术路线:代码研究背景: 多起点多终点多旅行商问题是旅行商问题(TSP)的一个扩展,该问题要求确定多个旅行商从各自的起点出发,分别经过一系列目标点最终回到各自的终点,使得总路…...

计算机毕业设计 | springboot+vue房屋租赁管理系统(附源码)

1,绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高,越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中,大家也面临着各种各样的问题,比如需要费时费力去现场看房&…...

重大活动网络安全保障建设及运营指南

在当今高度数字化的社会中,各类重大活动如会议、展览、赛事及庆典等正面临着日益复杂和严峻的网络安全威胁。这些威胁不限于网络入侵或数据泄露,更涉及到对基础设施、关键信息系统和公众舆论的复杂攻击,需要国际社会的密切合作和长期关注。因…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

day36-多路IO复用

一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

MySQL 主从同步异常处理

阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示&#xff…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

用鸿蒙HarmonyOS5实现国际象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...