【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
本次笔记内容:
6-5 控制流语句SDT
6-6 布尔表达式SDT
6-7 控制流的栗子
本节课幻灯片,见于我的 GitHub 仓库:第13讲 中间代码生成_3.pdf
文章目录
- 控制流语句及其SDT
- 控制流语句的基本文法
- 控制流语句的代码结构
- 控制流语句的SDT
- if-then-else语句的SDT
- if-then语句的SDT
- while-do语句的SDT
- 布尔表达式及其SDT
- 布尔表达式的基本文法
- 布尔表达式的SDT
- B → B1 or B2 的 SDT
- B → B1 and B2 的 SDT
- 控制流翻译的例子
- 控制流语句的SDT
- SDT的通用实现方法
- 例
控制流语句及其SDT
控制流语句的基本文法
- P→SP\to SP→S
- P→S1S2P\to S_1S_2P→S1S2
- S→id=E;∣L=E;S\to \text{id}=E; | L=E;S→id=E;∣L=E;
- S→ifBthenS1∣ifBthenS1elseS2∣whileBdoS1S\to \text{if}\; B\; \text{then} S_1 |\; \text{if}\; B \;\text{then}\; S_1 \; \text{else}\; S_2\; |\; \text{while}\; B\; \text{do}\; S_1S→ifBthenS1∣ifBthenS1elseS2∣whileBdoS1
如上,可对应程序的顺序结构、分支结构、循环结构。
控制流语句的代码结构
布尔表达式B被翻译成由跳转指令
构成的跳转代码。
继承属性:
- S.next:是一个地址,该地址中存放了紧跟在S代码之后的指令(S的
后继指令
)的标号
- B.true:是一个地址,该地址中存放了当B为
真
时控制流转向的指令的标号
- B.false:是一个地址,该地址中存放了当B为
假
时控制流转向的指令的标号
B.true
与 B.false
为 B 的两个出口。
用指令的标号标识
一条三地址指令。
控制流语句的SDT
返回的地址将被赋给 S.next (S.next=newlabel()
),但是这个具体地址要在分析完 S 后才产生 (label(S.next)
)。
if-then-else语句的SDT
根据结构图,可以得到对应的 SDT 。
if-then语句的SDT
while-do语句的SDT
布尔表达式及其SDT
布尔表达式的基本文法
注意,布尔常量 true 与 false 都是布尔表达式。
在跳转代码中,逻辑运算符&&
、||
和!
被翻译成跳转指令
。运算符本身不出现在代码中
,布尔表达式的值是通过代码序列中的位置来表示的。
布尔表达式的SDT
B → B1 or B2 的 SDT
首先还是画代码结构图,然后编写 SDT 。
B → B1 and B2 的 SDT
控制流翻译的例子
控制流语句的SDT
由前两课总结出控制流语句的 SDT 。这个文法不是LL1文法
,因此,不能在自顶向下的语法分析中,同时实现语义翻译。
而在产生式右部中,有含有内嵌的语义动作,因此,要想在自底向上的分析中进行翻译,需要修改这个文法。引入一些标记非终结符。
SDT的通用实现方法
任何SDT都可以通过下面的方法实现:
- 首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作。
例
首先由语句绘制出语法分析树
。
接着,由语法分析树编写SDT。这里,S.n
就是S.next
。
假设下一条指令的标号是 1 号,则把 S.beigin=L2
赋值为 1 。右上角为产生的指令。
用蓝色数字标出变量对应的地址。
如上,右边是这些三地址指令对应的自然式形式。
【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子相关推荐
- 【编译原理笔记20】代码生成:代码生成器的主要任务,一个简单的目标机模型,指令选择,寄存器的选择,寄存器选择函数getReg的设计,窥孔优化
本次笔记内容: 9-1 代码生成器的主要任务 9-2 一个简单的目标机模型 9-3 指令选择 9-4 寄存器的选择 9-5 寄存器选择函数getReg的设计 9-6 窥孔优化 本节课幻灯片,见于我的 ...
- 编译原理笔记(二)之词法分析
编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...
- zucc 编译原理 笔记
zucc 编译原理 笔记 lec02 lec03 lec04
- 【编译原理笔记14】中间代码生成:布尔表达式的回填,控制流语句的回填,switch语句的翻译,过程调用语句的翻译
本次笔记内容: 6-8 布尔表达式的回填 6-9 控制流语句的回填 6-10 SWITCH语句的翻译 6-11 过程调用语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第14讲 中间代码生成_ ...
- 【编译原理笔记12】中间代码生成:简单赋值语句的翻译,数组引用的翻译
本次笔记内容: 6-3 简单赋值语句的翻译 6-4 数组引用的翻译 本节课幻灯片,见于我的 GitHub 仓库:第12讲 中间代码生成_2.pdf 文章目录 简单赋值语句的翻译 赋值语句翻译的任务 赋 ...
- 【编译原理笔记01】什么是编译,编译系统各结构作用
资源Bilibili AV17649289 编译原理 哈尔滨工业大学 陈鄞 本次笔记内容: 1-1 什么是编译 1-2 编译系统的结构 1-3 词法分析 1-4 语法分析概述 1-5 语义分析概述 1 ...
- 了解编译原理-笔记小结
这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译 ...
- 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识
本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...
- 编译原理笔记 导言和目录
本学期编译原理的学习也差不多快结束了,在学习过程中也做了不少笔记. 为了准备即将来到的考试,我想把学习笔记再整理一遍.借此机会创建了这个专栏--为了满足创建专栏之前必须发布15篇以上的原创文章,我还特 ...
最新文章
- 使用Java监控工具出现 Can't attach to the process
- mysql display size_mysql integer size 大小
- mysql自增主键到头了怎么办_自增主键用完了怎么办
- 面向对象三大特性,六个原则
- 原创 | 科普一个 Star 数为 28.5k 的云原生网关
- 常用数据库端口号总结
- 日出时间php,返回给定的日期与地点的日落时间/ 日出时间
- C/C++编程(尾积相乘)
- boost 静态库命名规则
- android studio快捷键与Eclipse快捷键对比-没有之一
- Easy2d 文档教程之 Visual Studio 安装 Easy2D 游戏引擎
- 知道路径,如何下载服务器端的.frx文件
- Redis压力测试(详细)
- matlab现值与终值函数_Matlab金融工具箱中的主要功能函数
- 计算机 控制面板都打不开怎么办,控制面板打不开怎么办?控制面板打开办法大全...
- 正襟危坐说--操作系统(伍):进程间通信
- NYOJ:71-独木舟上的旅行
- FMC150-两路250Msps AD、两路500Msps DA FMC子卡模块
- Quarzt的学习以及系统配置自启动
- 打分功能,车牌区域划分
热门文章
- 【HDFS】HDFS与dfsadmin结合使用
- 移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究
- ubuntu16.04 打开chrome弹出“Enter password to unlock your login keyring”解决方法
- ie不兼容的几个js问题及解决办法
- 详解vue静态资源打包中的坑与解决方案
- 获取(可能)关联数组中的第一个键?
- msdn下载win11的方法,简单易操作
- windox与ubuntu18.04安装clion及导入qt库
- commons,jsoup,htmlunit,jackson,nekohtml,Object,xalan,xercesImpl,beanutils,lang3,httpclient,jar包下载
- 图片放大缩小旋转左移右移镜像倒影android