编译原理与技术 中间代码生成 2018/9/17 《编译原理与技术》讲义.

Slides:



Advertisements
Similar presentations
高等动物的 个体发育 作者:游隆信 松阳一中 二零零二年三月 被子植物子房的结构 及双受精过程 胚珠的结构 花粉管 精 子 卵细胞 极 核 子房壁 珠 被 珠 孔.
Advertisements

命题探究 从地形、气候、自然资源、自然灾害等地理要 素对农业、工业、交通运输和聚落的影响方面正确 认识人地关系,以谋求人类与自然环境和谐发展 第四章 自然环境对人类活动的影响 考纲解读 1. 地表形态对聚落及交通线路分布的影响 2. 全球气候变化对人类活动的影响 3. 自然资源对人类生存与发展的意义.
龙泉护嗓5班 优秀作业展.
九十五年國文科命題知能 研習分享.
大學入學考試中心 九十六學度學科能力測驗試題 國文科 -哈利波特番外篇-
關於「中華民國國民健保卡」 (健保 IC 卡內容)
第十六专题 近代以来世界的科学 技术和文学艺术
第二章 复式记账原理*** 主要内容、重点难点: 1.会计要素与会计等式*** 2.会计科目与账户*** 3. 借贷记账法***
高考地理复习应注意的问题 构建知识网络 培养读图技能 掌握答题规律.
编 译 原 理 指导教师:杨建国 二零一零年三月.
第五章 语法制导的翻译 赵建华 南京大学计算机系 2010年3月.
第二单元 生产、劳动与经营.
编译原理第二次习题课 王静.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
氧气的制法 装置 原理 练习 随堂检测.
1、分别用双手在本上写下自己的名字 2、双手交叉
C#程序设计案例教程 第3章 程 序 结 构.
2007年11月考试相关工作安排 各考试点、培训中心和广大应考人员:
作文教学如何适应高考的要求 漳州市普教室 李都明
知识点一 第一节 理解教材新知 知识点二 区域的基本含义 知识点三 考向一 把握热点考向 考向二 随堂基础巩固 应用创新演练 课时跟踪训练
分式的乘除(1) 周良中学 贾文荣.
第四章 制造业企业 主要经济业务核算.
《思想品德》七年级下册 教材、教法与评价的交流 金 利 2006年1月10日.
财经法规与会计职业道德 (3) 四川财经职业学院.
2 分子的热运动.
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
第六章 中间代码生成 赵建华 南京大学计算机系.
你不得不知的几件事 2、图书《10天行测通关特训》 3、网络课程 《网校9元课程系列》《考前强化夜校班》 4、地面课程 《10天10晚名师密授营》《考前预测集训营》
第 5 章 流程控制 (一): 條件分支.
 第20讲 中国的交通.
第十二单元 第28讲 第28讲 古代中国的科技和文艺   知识诠释  思维发散.
國立花蓮女中101學年度 開學典禮簡報.
国际贸易法.
成才之路 · 地理 人教版 · 必修3 路漫漫其修远兮 吾将上下而求索.
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
狂賀!妝品系同學美容乙級通過 妝品系三甲 學號 姓名 AB 陳柔諺 AB 陳思妤 AB 張蔡婷安
C++Primer 3rd edition 中文版 Chap 5
编译原理与技术 第7章 中间代码生成 3学时.
C++中switch语句的BNF 否极泰来 ——《周易》.
6 下标变量的中间代码生成 下标:数组;变量: 下标变量:即数组分量: 简单变量:id,其地址可查到;
第4章 程序控制结构与算法基础.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
PHP 程式流程控制結構.
编译原理实践 5.给定语法的语法分析程序构造.
7.4 布尔表达式和控制流语句 布尔表达式有两个基本目的 计算逻辑值 c = (a > b) && a > 1
第七章 语义分析和中间代码产生 静态语义检查 类型检查 控制流检查 一致性检查 相关名字检查 名字的作用域分析 语法分 析器 静态检 查器
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
中间代码生成.
陳維魁 博士 儒林圖書公司 第五章 控制結構 陳維魁 博士 儒林圖書公司.
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
第五章 相交线与平行线 三线八角.
组合逻辑电路 ——中规模组合逻辑集成电路.
第3章 JavaScript基本语句.
习题课 编译原理与技术 计算机科学与技术学院 李诚.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
◆ 第3節 基音與泛音 一、縱波的駐波 二、開管樂器的駐波 三、閉管樂器的駐波 四、共鳴空氣柱實驗 範例 1 範例 2 範例 3 範例 4
單元名稱:結構化程式設計 報告人 劉洲溶.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
第二章 Java基本语法 讲师:复凡.
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
手机淘宝“变形”产品—微淘 操作流程指南 (内测版).
顺序查找与二分查找复习.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Presentation transcript:

编译原理与技术 中间代码生成 2018/9/17 《编译原理与技术》讲义

中间代码生成 -布尔表达式翻译 -控制流语句翻译 2018/9/17 《编译原理与技术》讲义

布尔表达式的翻译 布尔表达式文法G4 EE1 or E2 | E1 and E2 | not E1 | ( E1 ) | id1 relop id2 | true | false | id3 布尔运算符 or 、and 和 not(优先级、结合性) 关系运算符 relop:<、≤、=、≠、>和≥ 布尔常量:true和false 布尔变量:id3 2018/9/17 《编译原理与技术》讲义

布尔表达式的翻译 两种翻译方法 - 数值表示法(完全计算) 类似算术表达式的翻译,如布尔表达式 true and false or ( 2 > 1 )的计算为 false or ( 2>1 )false or truetrue - 短路计算法(不完全计算或解释法) A or B  if A then true else B A and B  if A then B else false not A  if A then false else true 借助控制流语句的思路,部分(不完全地-用转移语句)“计算”布尔表达式的值以确定整个表达式的真、假。 2018/9/17 《编译原理与技术》讲义

布尔表达式的翻译 数值表示法 用1表示true,0代表false。 (1)EE1 or E2 { t := newtemp; emit( t “:=” E1.place “or” E2.place); E.place := t } (2)EE1 and E2 (3)Enot E1 (4)E( E1 ) 2018/9/17 《编译原理与技术》讲义

布尔表达式的翻译 数值表示法 nextcode : emit产生三地址语句的编号;产生后,nextcode++ (5)E id1 relop id2 { t:= newtemp; emit( “if” id1.place relop.op id2 .place goto nextcode+3 ); emit( t “:=” 0 ); emit( “goto” nextcode+2); emit( t “:=” 1 ); E.place := t; } nextcode : emit产生三地址语句的编号;产生后,nextcode++ 2018/9/17 《编译原理与技术》讲义

id1 relop id2 (关系表达式) i : if id1 relop id2 goto i+3 i+1: t := 0 i+2: false true i+1: t := 0 i+2: goto i+4 i+3: t := 1 i+4: 2018/9/17 《编译原理与技术》讲义

布尔表达式的翻译 数值表示法 (6) E true { t := newtemp; emit( t “:=” 1 ); E.place := t } (7) E false { t := newtemp; emit( t “:=” 0 ); E.place := t } (8) E id3 { t := newtemp; emit( if id.place “goto” nexcode+3); emit( t “:=” 0 ); emit( “goto” nextcode+2); emit( t “:=” 1); E.place := t } 2018/9/17 《编译原理与技术》讲义

id(布尔变量) i : if id goto i+3 i+1: t := 0 i+2: goto i+4 i+3: t := 1 i+4: false true i+1: t := 0 i+2: goto i+4 i+3: t := 1 i+4: 2018/9/17 《编译原理与技术》讲义

e.g.16 a<b or c=d and not e>f 的三地址码: (100) if a<b goto 103 (104) if c=d goto 107 (105) t2 := 0 (106) goto 108 (107) t2 := 1 //以上为c=d的翻译 2018/9/17 《编译原理与技术》讲义

e.g.16 a<b or c=d and not e>f 的三地址码: (108) if e>f goto 111 (112) t4 := not t3 //以上为 not e>f 的翻译 (113) t5 := t2 and t4 //以上为 c=d and not e>f 的翻译 (115) t6 := t1 or t5 //以上为 a<b or c=d and not e>f 的翻译 2018/9/17 《编译原理与技术》讲义

布尔表达式的翻译-短路计算 a<b or c=d and not e>f true L_true true false true L_false false false L_true-真出口:整个布尔表达式为真时,控制流应转移到的目标语句(代码);反之为假时则转到 L_false-假出口。 表示转移到的目标语句在有关布尔表达式翻译时尚未确定。 2018/9/17 《编译原理与技术》讲义

布尔表达式的翻译 短路计算 e.g.17 a<b or c=d and not e>f的短路计算三地址码: if a<b goto L_true goto L1 L1: if c=d goto L2 goto L_false L2: if e>f goto L_false goto L_true 2018/9/17 《编译原理与技术》讲义

短路计算 not E1 E1 or M E2 E1 and M E2 ( E1 ) false 真出口 true 真出口 假出口 true 2018/9/17 《编译原理与技术》讲义

短路计算 true id1 relop id2 goto - if id1 relop id2 goto - false goto - 真出口 true 真出口 true id1 relop id2 goto - 假出口 false if id1 relop id2 goto - goto - false false 假出口 goto - 2018/9/17 《编译原理与技术》讲义

短路计算 回填技术 -布尔表达式短路计算翻译中,产生了转移目标不明确的条件或无条件代码; -当有关目标地址确定后,可将这些目标地址填回到有关代码中。 -将有相同转移目标的转移代码的编号串起来形成链;可以方便回填目标地址。 2018/9/17 《编译原理与技术》讲义

E.truelist :布尔表达式代码中所有转向真出口的代码语句链; E.falselist :所有转向假出口的代码语句链; 回填技术 -相关符号属性及语义函数: E.truelist :布尔表达式代码中所有转向真出口的代码语句链; E.falselist :所有转向假出口的代码语句链; backpatch( code-list, target-code ) //将目标地址target-code填回code-list中每条语句 merge( code-list1, code-list2 ) //合并链code-list1和code-list2(它们包含的语句转移目标相同) makelist( code-No ) , makelist()-建立含语句编号为code-No的链或空链 M { M.code := nextcode } // 获取下一三地址代码(语句)的编号(作为转移目标来回填) 2018/9/17 《编译原理与技术》讲义

短路计算及回填的翻译方案 (1) EE1 or M E2 { backpatch( E1.falselist, M.code); E.truelist := merge( E1.truelist,E2.truelist); E.falselist := E2.falselist; } (2) EE1 and M E2 { backpatch( E1.truelist, M.code); E.falselist := merge( E1.falselist,E2.falselist); E.truelist := E2.truelist; } 2018/9/17 《编译原理与技术》讲义

E.truelist := E1.falselist; E.falselist := E1.truelist; } (3) Enot E1 { E.truelist := E1.falselist; E.falselist := E1.truelist; } (4) E( E1 ) { E.truelist := E1.truelist; E.falselist := E1.falselist; } (5) E id1 relop id2 { E.truelist:=makelist(nextcode); emit( “if” id1.place relop.op id2.place “goto” -); E.falselist := makelist( nextcode ); emit( “goto” -); } 2018/9/17 《编译原理与技术》讲义

E.truelist := makelist( nextcode ); emit( “goto” -); E.falselist := makelist(); } (7) E false { E.falselist := makelist( nextcode ); E.truelist := makelist(); } 2018/9/17 《编译原理与技术》讲义

控制流语句的翻译 描述控制流语句的文法G5: (1) S if E then S1 (2) S if E then S1 else S2 (3) S while E do S1 (4) S for id := E1 to E2 do S1 (5) S begin L end // compound statement (6) S A // 赋值语句 (7) L L1 ; S // Statements List (8) L S 2018/9/17 《编译原理与技术》讲义

条件语句的翻译(1) if E then S1 的代码结构 箭头线表示控制流方向; E.truelist和E.falselist 意义同前; S.nextlist - 语句S的代码中所有跳转到未知目标地址的转移代码(如果有的话)的编号链。该未知目标地址是指语义上语句S执行结束后应执行的下一代码的位置。 E.truelist E.code E.falselist M S1.code S1.nextlist ? 未知目标地址 2018/9/17 《编译原理与技术》讲义

条件语句的翻译(1) (1) S if E then M S1 { backpatch( E.truelist, M.code ); S.nextlist := merge( E.falselist, S1.nextlist ) } 2018/9/17 《编译原理与技术》讲义

条件语句的翻译(2) if E then S1 else S2的代码结构 E.code E.truelist E.code E.falselist 在代码标号t处强制产生无条件转移代码,转移目标待回填。 M1 S1.code t: goto - S1.nextlist M2 S2.code S2.nextlist ? 未知目标地址 2018/9/17 《编译原理与技术》讲义

条件语句的翻译(2) (2) S if E then M1 S1 N else M2 S2 { backpatch( E.truelist, M1.code ); backpatch( E.falselist, M2.code ); S.nextlist := merge( S1.nextlist, S2.nextlist, N.code) ; } N { N.code := makelist(nextcode); //标号t emit( “goto” -); 2018/9/17 《编译原理与技术》讲义

循环语句的翻译(1) while E do S1 的代码结构 M1: E.code 产生无条件转移语句 E.truelist E.falselist 产生无条件转移语句 goto M1(跳转至循环条件测试代码开始处) M2 S1.code goto M1 S1.nextlist ? 未知目标地址 2018/9/17 《编译原理与技术》讲义

循环语句的翻译(1) (3) S while M1 E do M2 S1 { backpatch( E.truelist, M2.code ); backpatch( S1.nextlist, M1.code ); S.nextlist := E.falselist; emit( “goto” M1.code ); } 2018/9/17 《编译原理与技术》讲义

循环语句的翻译(2) for id := E1 to E2 do S1的代码结构 待回填的目标地址 id := E1.place TRUE t: if id > E2.place goto - FALSE S1.code S1.nextlist id := id + 1 goto t ? 未知目标地址 2018/9/17 《编译原理与技术》讲义

循环语句的翻译(2) (4) F  for id := E1 to E2 do { p := lookup( id.name ); F.place := p; emit( id “:=” E1.place ); t := nextcode // 标号t F.again := t; F.falselist := makelist( t ) ; emit( “if” p > E2.place “goto” -); } S  F S1 { t := nextcode; emit( F.place “:=” F.place “+” 1); emit( “goto” F.again); backpatch( S1.nextlist, t ); S.nextlist := F.falselist; } 2018/9/17 《编译原理与技术》讲义

循环语句的翻译(3) 如何翻译C语言的for语句? S for ( E1 ; E2 ; E3 ) S1 2018/9/17 《编译原理与技术》讲义

文法G4中其它语句的翻译 (5) S begin L end { S.nextlist := L.nextlist } (6) S A { S.nextlist := makelist();//empty } // A-表示赋值语句; (7) L L1 ; M S { backpatch( L1.nextlist, M.code); L.nextlist := S.nextlist ; } (8) L S { L.nextlist := S.nextlist } 2018/9/17 《编译原理与技术》讲义

CASE/SWITCH语句的翻译(0) (9) S switch E begin case C1 : S1; case C2 : S2; … case Cn-1 : Sn-1; default : Sn; end 2018/9/17 《编译原理与技术》讲义

CASE/SWITCH语句 代码结构 E.code t: goto test ( 待回填) Li : Si.code ti : goto next ( 待回填) test : if E.place = C1 goto L1 if E.place = C2 goto L2 … … if E.place = Cn-1 goto Ln-1 goto Ln next: 2018/9/17 《编译原理与技术》讲义

CASE/SWITCH语句的翻译(1) (1) 分析完 SWITCH E 产生 E.code t: goto test ( 待回填) 情况常量表 常量 标号 (2) 分析完一个 case Ci: Si 产生如下代码,并将标号Li和常量Ci保存到case 情况常量表 C1 L1 … Ci Li Li : Si.code ti : goto next ( 待回填) ... … - Ln SWITCH中default 2018/9/17 《编译原理与技术》讲义

CASE/SWITCH语句的翻译(2) (3) 分析完 end(SWITCH结束) ,此时可以查看情况常量表产生如下代码,并将标号test回填到包含t处的转移代码中。 合并所有Si.nextlist和标号ti 即为SWITCH语句的nextlist。 test : if E.place = C1 goto L1 if E.place = C2 goto L2 … … if E.place = Cn-1 goto Ln-1 goto Ln next: 情况常量表 常量 标号 C1 L1 … Ci Li ... … - Ln 2018/9/17 《编译原理与技术》讲义

e.g.17 控制流语句的翻译 翻译以下语句序列: if ( a<b or c<d and e<f ) then while ( a>c ) do c := c +1 else d := d + 1; e := e + d; 2018/9/17 《编译原理与技术》讲义

e.g.17 控制流语句的翻译 L2 L1 ; S5 A3 S4 if E1 then S2 else S3 while E2 do S1 2018/9/17 《编译原理与技术》讲义

e.g.17 控制流语句的翻译 一、翻译 E1:( a<b or c<d and e<f ) (100) if a<b goto 106 (101) goto 102 //用102回填(101) (102) if c<d goto 104 //用104回填(102) (103) goto 111 (104) if e<f goto 106 (105) goto 111 truelist: { 100, 104 } falselist: { 103, 105 } 2018/9/17 《编译原理与技术》讲义

e.g.17 控制流语句的翻译 二、翻译 S2:while E2 do S1 (106) if a>c goto 108 //用108回填(106) (107) goto 112 (108) c := c + 1 // S1A1 S1.nextlist={} (109)goto 106 // 转至循环入口(106) S2.nextlist: { 107 } (110) goto 112 // 由N生成 (111) d := d + 1 // S3A2 S3.nextlist={} 2018/9/17 《编译原理与技术》讲义

e.g.17 控制流语句的翻译 三、分析完S4 用106回填(100)和(104);用111回填(103)和(105) S4.nextlist: { 107, 110 } 四、分析完L1 L1.nextlist: { 107, 110 } 五、分析S5 (112) e := e + d // S5A3 S5.nextlist={} 2018/9/17 《编译原理与技术》讲义

e.g.17 控制流语句的翻译 六、分析完L2 用112回填(107)和(110) L2.nextlist: {} 2018/9/17 《编译原理与技术》讲义

e.g.17 控制流语句的翻译 (100) if a<b goto 106 (106) if a>c goto 108 (101) goto 102 (107) goto 112 (102) if c<d goto 104 (108) c := c + 1 (103) goto 111 (109) goto 106 (104) if e<f goto 106 (110) goto 112 (105) goto 111 (111) d := d + 1 (112) e := e + d 2018/9/17 《编译原理与技术》讲义

e.g.18 Linux下C语言控制流语句的翻译 1)if语句 2)for语句 3)do-while 语句 2018/9/17 《编译原理与技术》讲义