本次笔记内容:
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→S1​S2​
  • 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​∣ifBthenS1​elseS2​∣whileBdoS1​

如上,可对应程序的顺序结构、分支结构、循环结构。

控制流语句的代码结构


布尔表达式B被翻译成由跳转指令构成的跳转代码。

继承属性:

  • S.next:是一个地址,该地址中存放了紧跟在S代码之后的指令(S的后继指令)的标号
  • B.true:是一个地址,该地址中存放了当B为时控制流转向的指令的标号
  • B.false:是一个地址,该地址中存放了当B为时控制流转向的指令的标号

B.trueB.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,控制流翻译的例子相关推荐

  1. 【编译原理笔记20】代码生成:代码生成器的主要任务,一个简单的目标机模型,指令选择,寄存器的选择,寄存器选择函数getReg的设计,窥孔优化

    本次笔记内容: 9-1 代码生成器的主要任务 9-2 一个简单的目标机模型 9-3 指令选择 9-4 寄存器的选择 9-5 寄存器选择函数getReg的设计 9-6 窥孔优化 本节课幻灯片,见于我的 ...

  2. 编译原理笔记(二)之词法分析

    编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...

  3. zucc 编译原理 笔记

    zucc 编译原理 笔记 lec02 lec03 lec04

  4. 【编译原理笔记14】中间代码生成:布尔表达式的回填,控制流语句的回填,switch语句的翻译,过程调用语句的翻译

    本次笔记内容: 6-8 布尔表达式的回填 6-9 控制流语句的回填 6-10 SWITCH语句的翻译 6-11 过程调用语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第14讲 中间代码生成_ ...

  5. 【编译原理笔记12】中间代码生成:简单赋值语句的翻译,数组引用的翻译

    本次笔记内容: 6-3 简单赋值语句的翻译 6-4 数组引用的翻译 本节课幻灯片,见于我的 GitHub 仓库:第12讲 中间代码生成_2.pdf 文章目录 简单赋值语句的翻译 赋值语句翻译的任务 赋 ...

  6. 【编译原理笔记01】什么是编译,编译系统各结构作用

    资源Bilibili AV17649289 编译原理 哈尔滨工业大学 陈鄞 本次笔记内容: 1-1 什么是编译 1-2 编译系统的结构 1-3 词法分析 1-4 语法分析概述 1-5 语义分析概述 1 ...

  7. 了解编译原理-笔记小结

    这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译 ...

  8. 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识

    本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...

  9. 编译原理笔记 导言和目录

    本学期编译原理的学习也差不多快结束了,在学习过程中也做了不少笔记. 为了准备即将来到的考试,我想把学习笔记再整理一遍.借此机会创建了这个专栏--为了满足创建专栏之前必须发布15篇以上的原创文章,我还特 ...

最新文章

  1. 使用Java监控工具出现 Can't attach to the process
  2. mysql display size_mysql integer size 大小
  3. mysql自增主键到头了怎么办_自增主键用完了怎么办
  4. 面向对象三大特性,六个原则
  5. 原创 | 科普一个 Star 数为 28.5k 的云原生网关
  6. 常用数据库端口号总结
  7. 日出时间php,返回给定的日期与地点的日落时间/ 日出时间
  8. C/C++编程(尾积相乘)
  9. boost 静态库命名规则
  10. android studio快捷键与Eclipse快捷键对比-没有之一
  11. Easy2d 文档教程之 Visual Studio 安装 Easy2D 游戏引擎
  12. 知道路径,如何下载服务器端的.frx文件
  13. Redis压力测试(详细)
  14. matlab现值与终值函数_Matlab金融工具箱中的主要功能函数
  15. 计算机 控制面板都打不开怎么办,控制面板打不开怎么办?控制面板打开办法大全...
  16. 正襟危坐说--操作系统(伍):进程间通信
  17. NYOJ:71-独木舟上的旅行
  18. FMC150-两路250Msps AD、两路500Msps DA FMC子卡模块
  19. Quarzt的学习以及系统配置自启动
  20. 打分功能,车牌区域划分

热门文章

  1. 【HDFS】HDFS与dfsadmin结合使用
  2. 移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究
  3. ubuntu16.04 打开chrome弹出“Enter password to unlock your login keyring”解决方法
  4. ie不兼容的几个js问题及解决办法
  5. 详解vue静态资源打包中的坑与解决方案
  6. 获取(可能)关联数组中的第一个键?
  7. msdn下载win11的方法,简单易操作
  8. windox与ubuntu18.04安装clion及导入qt库
  9. commons,jsoup,htmlunit,jackson,nekohtml,Object,xalan,xercesImpl,beanutils,lang3,httpclient,jar包下载
  10. 图片放大缩小旋转左移右移镜像倒影android