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

中间语言

中间语言的特点和作用

(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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/645639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css卡片翻转 父元素翻转子元素不翻转效果

css卡片翻转 父元素翻转子元素不翻转效果 vue <div class"moduleBox"><div class"headTitle"><span class"headName">大额案例</span></div><div class"moduleItem"><span class"module…

时间(空间)复杂度(结构篇)

目录 前言&#xff1a; 一、时间复杂度 1.1 时间复杂度的定义 1.2 时间复杂度的分析 表示方法&#xff1a; 1.3 常见的时间复杂度 1.4 时间复杂度的计算以及简单的分析 冒泡排序 折半查找&#xff08;二分查找&#xff09; 斐波那契数列&#xff08;递归&#xff09…

手把手教学,一站式教你实现服务器(Ubuntu)Anaconda多用户共享

背景&#xff1a;书接上回&#xff0c;一站式安装Ubuntu及配置服务器手把手教学&#xff0c;一站式安装ubuntu及配置服务器-CSDN博客 在安装及配置好服务器后&#xff0c;因为课题组可能涉及多个用户共用一台服务器&#xff0c;为了防止服务器上代码误删和Anaconda环境管理混乱…

爽!AI手绘变插画,接单赚爆了!

我最近发现一款名叫Hyper-SD15-Scribble的AI项目&#xff0c;可以实现一键手绘变插画的功能&#xff0c;而且它搭载了字节出品的超快速生成图片的AI大模型Hyper-SD15&#xff0c;可以实现几乎实时生成图片&#xff0c;有了它&#xff0c;拿去接一些手绘商单分分钟出图&#xff…

安卓手机电脑平板均支持

最近随着人工智能的火热&#xff0c;越来越多人问我怎么设置&#xff0c;我这边主要提供简单的配置&#xff0c;能够实现想要的功能&#xff0c;不懂得的友友们可以私聊我&#xff0c;

MyBatis详细教程!!(入门版)

目录 什么是MyBatis&#xff1f; MyBatis入门 1&#xff09;创建工程 2&#xff09;数据准备 3&#xff09;配置数据库连接字符串 4&#xff09;写持久层代码 5&#xff09;生成测试类 MyBatis打印日志 传递参数 MyBatis的增、删、改 增&#xff08;Insert&#xff0…

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发&#xff0c;以后也会记录一些关于鸿蒙相关的问题和解决方法&#xff0c;希望能帮助到大家。 总的来说一般有下面这样的报错 报错一&#xff1a; Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…

Django-auth组件

Django-auth组件 1 表结构 我们从python manage.py migrate为我们创建的auth组件内置的表开始看 auth_user&#xff1a;用户表存储用户信息&#xff08;登录admin后台&#xff09; 里面的字段分两类&#xff1a;用户基本信息&#xff08;用户名&#xff0c;邮箱&#xff0c;密…

【线程的互斥】

线程的互斥 临界区资源多个线程的运行多个线程对同一资源的竞争原子性保持线程之间地互斥互斥量(锁的原理)为什么是原子的 正确使用锁 临界区资源 进程创建线程&#xff0c;是共享内存的&#xff0c;可以对共享的资源有很方便的操作&#xff0c;当一些共享资源可以被多个线程进…

【找出第 K 大的异或坐标值】python

4层循环暴力超时 class Solution:def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:nums[]for a in range(len(matrix)):for b in range(len(matrix[0])):num0for i in range(a1):for j in range(b1):num^matrix[i][j]nums.append(num)nums.sort()retu…

Golang实现文件复制

方法&#xff1a;三种 package zdpgo_fileimport ("errors""io""os" )// CopyFile 使用io.Copy进行文件的复制&#xff0c;同时也会复制文件的所有权限 // param src 复制文件 // param des 目标文件 // return error 错误信息 func CopyFile(s…

【QGIS入门实战精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山体阴影、耐用指数)

文章目录 一、加载dem二、山体阴影三、坡度四、坡向五、地形耐用指数六、地形位置指数七、地表粗糙度一、加载dem 二、山体阴影 方法一:符号系统 利用符号系统中的山体阴影,渲染出阴影效果。 方法二:山体阴影工具 该算法计算输入中的数字化地形模型的山体阴影。根据太阳的位…

2024年教你怎么将学浪视频保存到本地

你是否曾为无法将学浪视频保存到本地而烦恼&#xff1f;现在&#xff0c;我们将在2024年教给你如何解决这个问题&#xff01;只需简单几步操作&#xff0c;即可轻松将学浪视频保存到您的本地设备&#xff0c;随时随地想看就看&#xff01; 我已经将下载学浪的工具打包好了&…

OSPF网络类型实验2

对R4 对R5&#xff0c;找R1注册 对R1宣告环回&#xff0c;再宣告一下tunnel接口 本实验不考虑区域划分 现在已经全部宣告完成 对R1&#xff0c;2&#xff0c;3改接口 broadcast工作方式hello时间10s&#xff0c;然后进行dr选举&#xff0c;由于2&#xff0c;3之间没有伪广播 …

滑不动窗口的秘密—— “滑动窗口“算法 (Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

淘工厂订单导出自动化工具

目录 下载安装与运行 主要目的 其他工具的弊端 本工具的优势 视频演示 下载新版后的注意事项 支持的导出项 什么叫一单多拍 常见问题 如何实现快捷登录 导出卡住时如何操作 如何精确导出 下载安装与运行 下载、安装与运行 语雀 主要目的 导出订单信息&#xf…

兴业证券 | 哪些行业在提价?

一方面&#xff0c; 部分行业年初以来PPI价格整体上涨&#xff0c;4月进一步提价&#xff1b;另一方面&#xff0c;部分行业年初以来PPI价格整体下跌或者涨幅不高&#xff0c;但4月开始出现边际提升。 前言&#xff1a;年初以来&#xff0c;“提价”是一条重要的投资线索。我们…

秋招突击——算法打卡——5/25、5/26——寻找两个正序数组的中位数

题目描述 自我尝试 首先&#xff0c;就是两个有序的数组进行遍历&#xff0c;遍历到一半即可。然后求出均值&#xff0c;下述是我的代码。但这明显是有问题的&#xff0c;具体错误的代码如下。计算复杂度太高了&#xff0c;O&#xff08;n&#xff09;&#xff0c;所以会超时&…

Linux基础(六):Linux 系统上 C 程序的编译与调试

本篇博客详细分析&#xff0c;Linux平台上C程序的编译过程与调试方法&#xff0c;这也是我们后续程序开发的基础。 目录 一、第一个hello world程序 1.1 创建.c文件 1.2 编译链接 运行可执行程序 二、编译链接过程 2.1 预编译阶段 2.2 编译阶段 2.3 汇编阶段 2.4 链…