【编译原理复习笔记】中间语言
中间语言
中间语言的特点和作用
(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 E→EorE∣EandE∣notE∣(E)∣irelationopi∣i均为布尔表达式
计算布尔表达式的两种办法:
(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驱动。首先ÿ…...
生成式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 课题来源 随着社会的不断发展以及大家生活水平的提高,越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中,大家也面临着各种各样的问题,比如需要费时费力去现场看房&…...
重大活动网络安全保障建设及运营指南
在当今高度数字化的社会中,各类重大活动如会议、展览、赛事及庆典等正面临着日益复杂和严峻的网络安全威胁。这些威胁不限于网络入侵或数据泄露,更涉及到对基础设施、关键信息系统和公众舆论的复杂攻击,需要国际社会的密切合作和长期关注。因…...
OpenClaw定时任务实战:用Phi-3-vision-128k-instruct每日自动生成图文日报
OpenClaw定时任务实战:用Phi-3-vision-128k-instruct每日自动生成图文日报 1. 为什么需要自动化日报系统 每天早晨打开电脑,第一件事就是手动整理前一天的各类数据——项目进度、系统日志、团队协作记录,然后花半小时拼凑成一份图文并茂的日…...
C++头文件详解:<iomanip> 头文件使用详解
目录 一、前言 二、浮点数精度控制 2.1 fixed 与 setprecision() (1)fixed 的作用 (2)setprecision(n) 的作用 (3)示例:RGB 转 YUV 计算 2.2 scientific 科学计数法 三、设置输出宽度与…...
OpenClaw性能调优实战:提升Kimi-VL-A3B-Thinking多模态响应速度的5个技巧
OpenClaw性能调优实战:提升Kimi-VL-A3B-Thinking多模态响应速度的5个技巧 1. 问题背景与性能瓶颈分析 最近我在本地部署了Kimi-VL-A3B-Thinking多模态模型,并通过OpenClaw与之对接,构建了一个自动化图文处理的工作流。但在实际使用中发现&a…...
告别试用期焦虑:JetBrains IDE重置工具全面指南
告别试用期焦虑:JetBrains IDE重置工具全面指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 还在为JetBrains IDE试用期结束而烦恼吗?当你正沉浸在代码创作的高峰期,突然弹出…...
大模型工程师的黄金赛道:揭秘高薪岗位的核心技能与必备经验!
本文深入剖析了大模型领域内的五大核心岗位方向,包括基座模型训练、大模型微调、大模型开发、大模型推理部署以及多模态大模型。文章详细阐述了每个方向的工作内容、核心竞争力、所需经验及市场现状,并推荐了相关的开源教程。此外,还强调了在…...
第04章-开源鸿蒙的架构概览
第4章 开源鸿蒙的架构概览本章目标:从整体到局部,逐层剖析开源鸿蒙的系统架构,理解各层的职责与协作关系。4.1 整体架构 开源鸿蒙的系统架构采用分层设计,自上而下可以分为四层: ┌─────────────────…...
Kiro IDE remote extension host terminated unexpectedly #4231 官方状态:**未修复**(2026最新实测)
【重要】Kiro AI 远程连接崩溃问题 #4231 官方状态:未修复(2026最新实测) 文章目录【重要】Kiro AI 远程连接崩溃问题 #4231 官方状态:**未修复**(2026最新实测)问题描述复现条件官方 Issue 真实状态影响范…...
免疫治疗新视角:CD47 (分化簇47) 信号通路机制与药物研发技术综述
在生物制药与免疫学领域,CD47 (分化簇47) 作为连接先天免疫与适应性免疫的关键节点,近年来备受关注。作为一种广泛表达的跨膜糖蛋白,它通过复杂的信号轴调控免疫细胞的吞噬行为。本文将深入剖析CD47的作用机制、当前药物研发的临床进展以及未…...
JPEGENC:4KB RAM下运行的嵌入式JPEG编码器
1. JPEGENC:面向资源受限MCU的轻量级JPEG编码器深度解析1.1 设计哲学与工程定位JPEGENC并非对libjpeg或mozjpeg等通用JPEG库的简单裁剪,而是在裸机(Bare-metal)约束下重构的嵌入式专用编码器。其核心设计目标直指MCU开发中最尖锐的…...
AI编程实战:从零到一搭建全栈项目睹
1. 核心概念 在 Antigravity 中,技能系统分为两层: Skills (全局库):实际的代码、脚本和指南,存储在系统级目录(如 ~/.gemini/antigravity/skills)。它们是“能力”的本体。 Workflows (项目级):…...
