7.4 布尔表达式和控制流语句 布尔表达式有两个基本目的 计算逻辑值 c = (a > b) && a > 1

Slides:



Advertisements
Similar presentations
1.1 程序和程序设计 程 序:简单的说程序就是指令的集合。 计算机设计语言: 机器语言 :二进制 0 、 1 汇编语言:助记符(英语单词)。 高级语言: 人类自然语言(数学语言 + 英语) 如: C 语言、 Qbasic 、 VB 等 第一章:程序设计基本概念.
Advertisements

性教育教學模組設計 主題:身體自主權 台中市忠明國小 巫偉鈴.
整体销售方案 中山市美好物业代理有限公司
我征服了黃山 林達的黃山之旅 2006春.
“三生教育”专题 生命·生存·生活.
高考地理复习应注意的问题 构建知识网络 培养读图技能 掌握答题规律.
编 译 原 理 指导教师:杨建国 二零一零年三月.
编译原理第二次习题课 王静.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
臺中市頭家國小 生理衛生講座 青春期的奧秘 ‧說到青春期,你會想到? ‧班級表現最好的,有獎徵答有優先權。 葉孟娟老師、黃文玲老師.
校园信息管理系统 河北科技大学网络中心 2000/4/10.
国王赏麦的故事.
C#程序设计案例教程 第3章 程 序 结 构.
第一章信託法 第一節 信託契約 第二節 信託財產 第三節 受益人 第四節 受託人 第五節 信託關係之消滅.
寻觅节日诗情.
徵收苗栗市福全段147、1588及文心段10、11地號等4筆土地之
第四章 借贷记账法 在制造业中的应用.
1. 民主社會裡,公民的參與有其重要性,而透過政治參與無法達成下列哪一項目的?
讲 义 大家好!根据局领导的指示,在局会计科和各业务科室的安排下,我给各位简要介绍支付中心的工作职能和集中支付的业务流程。这样使我们之间沟通更融洽,便于我们为预算单位提供更优质的服务。 下面我主要从三方面介绍集中支付业务,一是网上支付系统,二是集中支付业务流程及规定等,
計算機概論 使用Excel製作試算表.
全球暖化 想知道全球暖化的嚴重性嗎? 那就繼續看下去吧!! 組員:陳儀君60524 蘇鈺祺60526 于玉琳60528 林宥嫻60521.
中国人民公安大学经费管理办法(试行) 第一章总则 第四条:“一支笔” “一支笔”--仅指单位主要负责人。负责对本 单位的经费进行审核审批。
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
第六章 中间代码生成 赵建华 南京大学计算机系.
第 5 章 流程控制 (一): 條件分支.
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
编译原理与技术 中间代码生成 2018/9/17 《编译原理与技术》讲义.
第七章 中间代码生成 静态 中间 分析 检查 代码 记号流 器 生成 本章内容 介绍几种常用的中间表示:后缀表示、图形表示和三地址代码
程式設計實作.
第5章 程序结构.
C++Primer 3rd edition 中文版 Chap 5
编译原理与技术 第7章 中间代码生成 3学时.
6 下标变量的中间代码生成 下标:数组;变量: 下标变量:即数组分量: 简单变量:id,其地址可查到;
Access VBA程序设计 本章重点 Access Basic编程语言 运算符、函数与表达式 Access Basic语句 模块的使用
第4章 程序控制结构与算法基础.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
PHP 程式流程控制結構.
程式語言Visual Basic 重複結構 黃瀧輝 老師 Long Hwai,Huang.
编译原理实践 5.给定语法的语法分析程序构造.
第七章 语义分析和中间代码产生 静态语义检查 类型检查 控制流检查 一致性检查 相关名字检查 名字的作用域分析 语法分 析器 静态检 查器
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
中间代码生成.
陳維魁 博士 儒林圖書公司 第五章 控制結構 陳維魁 博士 儒林圖書公司.
編譯程式設計 期末專題說明 V1.1 May 2004.
第二章 词法分析4 词法分析程序实现 构造词法分析器步骤 单词的形式化描述 词法分析程序的实现.
江西财经大学信息管理学院 《数据库应用》课程组2007
第七章 语义分析和中间代码生成 本章内容 介绍几种常用的中间表示:后缀表示、图形表示和三地址代码
小结 郭清溥.
经典算法之 冒 泡 排 序.
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
微信商城系统操作说明 色卡会智能门店.
习题课 编译原理与技术 计算机科学与技术学院 李诚.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
單元名稱:結構化程式設計 報告人 劉洲溶.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
第二章 Java基本语法 讲师:复凡.
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
數學遊戲二 大象轉彎.
大綱 一.受試者之禮券/禮品所得稅規範 二.範例介紹 三.自主管理 四.財務室提醒.
手机淘宝“变形”产品—微淘 操作流程指南 (内测版).
厉害了,我的国! 15会计2班团支部 2018年4月20日.
顺序查找与二分查找复习.
C#快速導讀 流程控制.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Presentation transcript:

7.4 布尔表达式和控制流语句 布尔表达式有两个基本目的 计算逻辑值 c = (a > b) && a > 1 在控制流语句中用作条件表达式 if (a > b && a > 1) then … 1/25

7.4 布尔表达式和控制流语句 布尔表达式有两种计算方式: if ( 1 or i++ > 3) then 布尔表达式的完全计算 E1 or E2 布尔表达式的“短路”计算 E1 or E2 定义成 if E1 then true else E2 E1 and E2 定义成 if E1 then E2 else false

7.4 布尔表达式和控制流语句 7.4.1 布尔表达式的翻译 E  E or E | E and E | not E | ( E ) | id relop id | true | false a < b的翻译 100: if a < b goto 103 101: t := 0 102: goto 104 103: t := 1 104: >, >=, <, <=, <>, == 对于a<b的翻译而言,由于三地址代码中不包括形如t=a<b的格式,故此使用if x relop y goto L 来实现。

7.4 布尔表达式和控制流语句 E  E1 or E2 {E.place := newtemp; emit (E.place, ‘:=’, E1.place, ‘or’ E2.place) } E  id1 relop id2 {E.place := newtemp; emit (‘if’, id1.place, relop.op, id2.place, ‘goto’, nextstat+3 ); emit (E.place, ‘:=’, ‘0’ ); emit (‘goto’, nextstat + 2 ); emit (E.place, ‘:=’, ‘1’ ) } a < b的翻译 100: if a < b goto 103 101: t := 0 102: goto 104 103: t := 1 104:

7.4 布尔表达式和控制流语句 7.4.2 控制流语句的翻译 S  if E then S1 | if E then S1 else S2 | while E do S1 | S1; S2 5/25

7.4 布尔表达式和控制流语句 指向E.true 指向E.true E.code 指向E.false E.code 指向E.false S1.code S1.code . . . S1.next: goto S.next (S1.next) E.false: S2.code E s1 (a) if--then . . . E s1 s2 (b) if-then-else E.code S1.code E.true: . . . 指向E.true 指向E.false goto S.begin S.begin: (c) while-do S1.code S2.code S1.next: . . . (d) S1; S2 E s1

7.4 布尔表达式和控制流语句 S  if E then S1 {E.true := newlabel; E.code S1.code E.true: . . . 指向E.true 指向E.false (a) if-then S  if E then S1 {E.true := newlabel; E.false := S.next; S1.next := S.next; S.code := E.code || gen(E.true, ‘:’) || S1.code }

7.4 布尔表达式和控制流语句 S  if E then S1 else S2 {E.true := newlabel; E.code S1.code E.true: . . . 指向E.true 指向E.false E.false: goto S.next S2.code (b) if-then-else S  if E then S1 else S2 {E.true := newlabel; E.false := newlabel; S1.next := S.next; S2.next := S.next; S.code := E.code || gen(E.true, ‘:’) || S1.code || gen(‘goto’, S.next) || gen(E.false, ‘:’) || S2.code}

7.4 布尔表达式和控制流语句 S  while E do S1 {S.begin:= newlabel; E.true := newlabel; E.false := S.next; S1.next := S.begin; S.code := gen(S.begin, ‘:’) || E.code || gen(E.true, ‘:’) || S1.code || gen(‘goto’, S.begin) } E.code S1.code E.true: . . . 指向E.true 指向E.false goto S.begin S.begin: (c) while-do

7.4 布尔表达式和控制流语句 S  S1; S2 {S.code := S1.code || gen(S1.next, ‘:’) || S2.code } S1.code S2.code S1.next: . . . (d) S1; S2 10/25

7.4 布尔表达式和控制流语句 7.4.3 布尔表达式的控制流翻译 如果E是a < b的形式, 那么代码是: if a < b goto E.true goto E.false

7.4 布尔表达式和控制流语句 表达式 a < b or c < d and e < f 的代码是: if a < b goto Ltrue goto L1 L1: if c < d goto L2 goto Lfalse L2: if e < f goto Ltrue

7.4 布尔表达式和控制流语句 E  E1 and E2 {E1.true := newlabel; E1.code 指向E1.false E1.true: E  E1 and E2 {E1.true := newlabel; E1.false := E.false; E2.true := E.true; E2.false := E.false; E.code := E1.code || gen(E1.true, ‘:’) || E2.code } E2.code . . . E1 and E2

7.4 布尔表达式和控制流语句 E  E1 and E2 {E1.true := newlabel; E1.false := E.false; E2.true := E.true; E2.false := E.false; E.code := E1.code || gen(E1.true, ‘:’) || E2.code } E  (E1 ) {E1.true := E.true; E.code := E1.code }

7.4 布尔表达式和控制流语句 E  E1 or E2 {E1.true := E.true; E1.false := newlabel; E2.false := E.false; E.code := E1.code || gen(E1.false, ‘:’) || E2.code } 15/25

7.4 布尔表达式和控制流语句 E  E1 or E2 {E1.true := E.true; E1.false := newlabel; E2.false := E.false; E.code := E1.code || gen(E1.false, ‘:’) || E2.code } E  not E1 {E1.true := E.false; E1.false := E.true; E.code := E1.code }

7.4 布尔表达式和控制流语句 E  id1 relop id2 如果E是a < b的形式, 那么代码是: if a < b goto E.true goto E.false E  id1 relop id2 {E.code := gen(‘if’, id1.place, relop.op, id2.place, ‘goto’, E.true) || gen(‘goto’, E.false) } E  true {E.code := gen(‘goto’, E.true)} E  false {E.code := gen(‘goto’, E.false)}

7.4 布尔表达式和控制流语句 7.4.4 开关语句的翻译 switch E begin case V1: S1 case V2: S2 . . . case Vn - 1: Sn – 1 default: Sn end

7.4 布尔表达式和控制流语句 分支数较少时 t := E的代码 if t  V1 goto L1 S1的代码 goto next L1: if t  V2 goto L2 S2的代码 L2: . . . . . . Ln-2: if t  Vn-1 goto Ln-1 Sn -1的代码 | goto next Ln-1: Sn的代码 next:

7.4 布尔表达式和控制流语句 分支较多时,将分支测试的代码集中在一起, 便于生成较好的分支测试代码。 t := E的代码 | Ln: Sn的代码 goto test | goto next L1: S1的代码 |test: if t = V1 goto L1 goto next | if t = V2 goto L2 L2: S2的代码 | . . . goto next | if t = Vn-1 goto Ln-1 . . . | goto Ln Ln-1: Sn -1的代码 | next: goto next 20/25

7.4 布尔表达式和控制流语句 中间代码增加一种case语句,便于代码生成器 对它进行特别处理 test: case V1 L1 . . . case Vn-1 Ln-1 case t Ln next:

7.4 布尔表达式和控制流语句 7.4.5 过程调用的翻译 S  call id (Elist) Elist  Elist, E

7.4 布尔表达式和控制流语句 过程调用id(E1, E2, …, En)的中间代码结构 E1.place := E1的代码 . . . En.place := En的代码 param E1.place param E2.place param En.place call id.place, n

7.4 布尔表达式和控制流语句 S  call id (Elist) {为长度为n的队列中的每个E.place, emit(‘param’, E.place); emit(‘call’, id.plase, n) } Elist  Elist, E {把E.place放入队列末尾} Elist  E {将队列初始化,并让它仅含E.place} E1.place | E2.place | E3.place | E4.place …..

本 章 要 点 中间代码的几种形式,它们之间的相互转换 符号表的组织和作用域信息的保存 布尔表达式的两种不同实现方式 本 章 要 点 中间代码的几种形式,它们之间的相互转换 符号表的组织和作用域信息的保存 布尔表达式的两种不同实现方式 赋值语句和各种控制流语句的中间代码格式和生成中间代码的翻译方案 过程调用的中间代码格式和生成中间代码的翻译方案 25/25