编译原理与技术

Similar documents
Microsoft PowerPoint - ch6 [Compatibility Mode]

Microsoft PowerPoint - ch7 [Compatibility Mode]

Microsoft PowerPoint - ir

"# $ % & $# $ % & "!! " # $! %(() * )(

$$% % $ (%) % %$ $ ( *+,)(-)-./0-1//0- %) %) % - $%2)33%0 $ % ((3./. 3/3 )3 / % (()33(1 % (()3(/ %89856%:;< % (()3 0()0 3 (. <<=330(<</ 3 3. ()

Microsoft PowerPoint - L12-v3.pptx

Microsoft PowerPoint - ch7.ppt [兼容模式]

!"# $%& %!"# $%& %!"#$%& %! ( )***%% ) $)! +**+),,* -)+.* )( ) +, +*.*)+..**! )$,*)+$))$!"!#

9202reply-s.doc

ttian

! "#$%& $()*+#$, $(-.&,./.+#/(-.&01( &-#&(&$# (&2*(,#-3.,14& $ +()5(*-#5(-#/-/#(-1#&-+)(& :;<<= > A B?

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018

PowerPoint Presentation

Microsoft PowerPoint - 6 Intermediate-Code Generation.pptx

表 1 96 年 全 民 健 保 各 年 齡 組 門 診 申 報 件 數 單 位 : 萬 件 % 年 齡 組 合 計 男 女 件 數 占 率 件 數 占 率 件 數 占 率 合 計 33, , , 歲 4, ,

C = C + C C = + + C C C C 1 2 3

《米开朗琪罗传》

VHDL(Statements) (Sequential Statement) (Concurrent Statement) VHDL (Architecture)VHDL (PROCESS)(Sub-program) 2

再版前言

e bug 0 x=0 y=5/x 0 Return 4 2

九十六學年度第一學期第三次定期考國文科試題

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

!!" #" $" #%%& #%%& #

元 [ 所 ] IA27 ( D ) 下 列 何 項 情 況, 其 夫 妻 所 得 可 免 合 併 申 報? (A) 當 年 度 結 婚 (B) 當 年 度 離 婚 (C) 妻 58 歲, 夫 62 歲 無 所 得 受 其 子 扶 養 (D) 以 上 皆 是 [ 所 ]

Microsoft Word - ZLI14A0-105

菩提道次第廣論

路 上 沒 說 話, 車 子 被 爸 離 去 後 開 走 了, 沒 什 麼 變, 除 了 一 股 淡 淡 的 香 味, 我 不 太 習 慣, 像 空 氣 中 的 粉 塵, 左 飄 右 飄, 光 中 飛 舞 我 沒 提, 看 車 窗 外, 外 面 不 太 有 趣, 我 只 是 沒 事 幹, 我 們 本

繁 華 國 小 101 學 年 母 親 節 感 恩 惜 福 - 跳 蚤 市 場 暨 科 學 闖 關 遊 戲 親 子 活 動 實 施 計 畫 一 依 據 : 本 校 101 學 年 度 校 務 計 畫 及 行 事 曆 二 目 的 : 1. 培 養 學 生 感 恩 惜 物 知 福 惜 福 的 節 儉 觀

台 中 市 北 屯 區 東 山 里 橫 坑 9 林 志 明 巷 89-5 菜 豆 菜 大 漿 果 菜 豆 菜 大 漿 果 小 漿 果 核 果 柑 桔 無 陳 錦 生 新 竹 市 香 山 區


育儿小故事(四)

2016 年 地 质 工 程 系 教 学 工 作 安 排 2016 学 年 我 系 将 在 总 结 过 去 工 作 的 基 础 上, 结 合 今 年 学 院 以 抓 质 量 强 内 涵 促 改 革 调 结 构 建 品 牌 细 管 理 重 过 程 为 宗 旨, 以 规 范 管 理 深 化 内 涵 为


<4D F736F F D203136BCADBBD8D2E4D3EBD1D0BEBF2E646F63>

萧山中学课程建设方案.doc


Microsoft Word - 9pinggb_A4.doc

Microsoft Word - 9pinggb_A4-f4.doc

理 论 探 索 事 业 单 位 改 革 的 五 点 思 考 余 路 [ 摘 要 ] 事 业 单 位 改 革 是 中 国 改 革 的 重 要 环 节, 其 影 响 力 和 难 度 不 亚 于 国 有 企 业 改 革 本 文 着 重 围 绕 推 进 事 业 单 位 改 革 应 考 虑 的 五 个 方 面

日 本 位 于 亚 洲 东 部, 太 平 洋 西 北 角, 是 我 国 东 方 的 一 个 岛 国 在 洪 积 世 ( 注 1) 的 大 部 分 时 期 内, 日 本 与 大 陆 相 连 大 约 在 洪 积 世 晚 期 至 冲 积 世 ( 注 2) 初 期, 日 本 各 地 发 生 海 进, 出 现

2深化教育教学改革、创新人才培养模式

Microsoft Word - 9pinggb_let.doc

实 习 上 下 点 表 格 解 释 和 相 关 纪 律 要 求 : 1 表 格 中 所 有 名 词 都 为 简 称, 包 括 医 院 名 称 四 年 级 五 年 级 各 专 业 名 称 等 所 有 时 间 都 为 学 生 装 好 行 李 出 发 时 间, 请 提 前 0 分 钟 将 行 李 运 到

3 基 金 杠 杆 从 分 级 基 金 的 概 念, 我 们 知 道 了 分 级 基 金 的 A 份 额 是 每 年 获 得 固 定 收 益 的 稳 健 份 额,B 份 额 是 具 有 杠 杆 效 应 的 激 进 份 额 分 级 基 金 中 的 杠 杆 一 般 有 三 类 : 份 额 杠 杆 =(A

简报158期.doc

Microsoft Word - 9pingb5_let.doc

退休權益.ppt [相容模式]

Microsoft Word - 1.《國文》試題評析.doc

Ps22Pdf

$%%& ()*+, %&, %-&&%%,. $ %,, $,, & /$- 0(1 $%%& %& 234 %-%, 5&%6&633 & 3%%, 3-%, %643 -%%% :::; 7<9; %-%, 3$%$ :::;

# $# #!# # # # # # # %# # # &# # # # #! "

zt

投稿類別:電子工程類

zt

CC213

合金投资年报正文.PDF

从 宾 馆 到 又 一 城 是 十 五 分 钟, 从 又 一 城 到 邵 逸 夫 是 十 分 钟, 去 时 一 路 上 坡 很 辛 苦, 回 时 一 路 下 坡 很 轻 松, 很 像 上 小 学 时 的 心 情, 这 是 最 初 几 天 最 深 的 感 受 有 段 时 间 很 少 走 校 内 的 路


胃癌早诊早治技术方案.doc

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

untitled

内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句

主 題 四 : 都 卜 勒 效 應 一 都 卜 勒 效 應 1. 現 象 : 當 波 源 與 觀 察 者 連 線 間 有 相 對 運 動 時, 聽 者 所 接 收 到 的 頻 率 ( 視 頻 ) 將 與 波 源 之 原 頻 率 不 同, 此 現 象 稱 為 都 卜 勒 效 應 例 如 站 於 路 旁

<4D F736F F D AE61BBF4AAC0B9CEA6A8AA47B3F8A7695F3037BA74C547AAC02E646F63>

ebook14-4

(C) 比 得 上 (D) 如 果 17. ( ) 聖 賢 經 傳 和 傳 奇 小 說 兩 個 傳 字, 其 音 義 關 係 為 何? (A) 音 同 義 異 (B) 音 義 皆 同 (C) 義 同 音 異 (D) 音 義 皆 異 18. ( ) 下 列 選 項 中 的 形 似 字, 何 者 讀 音

HSK(基础)样题


# # # # # # = #, / / / / # 4 # # # /# 02-1 / 0 /? / 0 / 0? # # / >


第三节 软件测试的过程与策略

untitled

A. B. C. D. 2. A. B. C. D. 3. A. 4 N B. 18 N C. 40 N D N 1

Microsoft Word - 職業倫理與道德題庫.doc

山东2014第四季新教材《会计基础》冲刺卷第三套

大侠素材铺

! " # $ % & (( %) "*+,- &.(/-) & ( 0 & 1! % " % # % & & $ % "/()%!"# (( (02-03 /(((.1/.2( 4 //). /$0 3)0%. /1/%-2 (( ) / ((0 // "*+,- &.(/-) & ( 0 & 1

中華民國青溪協會第四屆第三次理監事聯席會議資料

《中国小百科全书(5):技术科学》

!! "#$% & ()*+,-. &/ 00 " %0#0 % 00 " %0#0 %1% 2 %1$ 2 % )869:;.,*8656<,*= 9*>? *> A6)5, B,55, C,*D, B6 E)*)7)55) " F9D,

就 构 成 了 盗 窃 罪 与 破 坏 交 通 设 施 罪 的 想 象 竞 合, 按 照 其 中 处 罚 较 重 的 犯 罪 处 罚 5. 答 案 :B 本 题 主 要 考 察 如 何 区 分 收 买 被 拐 卖 的 妇 女 儿 童 罪 与 拐 卖 妇 女 儿 童 罪 的 共 犯 问 题 ( 对 向

Microsoft Word 司考真?行政法勘?大表.doc

<453A5CC2EDC0F6C5C5B0E6CEC4BCFE5CC3F1B7A8A1A4C9CCB7A8A1A4C3F1CAC2CBDFCBCFB7A8D3EBD6D9B2C3D6C6B6C8D5AACEC4BCFE574F52445CB9D9B7BDD0DEB6A9B5E7D7D3B7FECEF1A3A8A1B6C3F1CBDFBDE2CACDA1B7BACDA1B6C1A2B7A8B7A8A1B7A3A92E646F63>

考 查 知 识 点 肝 气 疏 泄 调 畅 气 机 的 作 用, 主 要 表 现 在 以 下 几 个 方 面 :(1) 促 进 血 液 与 津 液 的 运 行 输 布 ;(2) 促 进 脾 胃 的 运 化 功 能 和 胆 汁 分 泌 排 泄 ;(3) 调 畅 情 志 ;(4) 促 进 男 子 排 精

! $%%&! (!"# $%%& $) * +, -. / 0 *-./ 0 /1 -!!!!!! 21.!!!!!! 31 /!!!!!! 41 0 $%%& )% $%%& 5 $%%& 6 $%%& $%%& ( #!! " #

应 仅 以 交 易 或 者 事 项 的 法 律 形 式 为 依 据 归 纳 体 现 实 质 重 于 形 式 会 计 信 息 质 量 要 求 的 有? (1) 融 资 租 入 固 定 资 产 视 同 自 有 固 定 资 产 (2) 长 期 股 权 投 资 后 续 计 量 成 本 法 与 权 益 法 的

5( " &$"" & & #! # # # # # # # # # # $ % & &( )( # # # *+,-,.. /012 # # "" # 3 % # # # # # ) &$"4 # # # # # # # # # # # # &$"! # & # ""!

99710a72ZW.PDF

!!! "# $ " %!!

优合会计考点直击卷子之财经法规答案——第八套

[1] (p.28) / / 3 4 [1] (p.26) [2] (p.171)

民 國 105 年 大 專 程 度 義 務 役 預 備 軍 官 預 備 士 官 考 選 簡 章 目 錄 壹 考 選 依 據 1 貳 考 ( 甄 ) 選 對 象 1 參 資 格 規 定 1 肆 員 額 及 專 長 類 別 2 伍 報 名 及 選 填 志 願 日 期 方 式 3 陸 選 填 官 科 (

untitled

过 程 排 除 A 正 确 答 案 是 B 14.A 解 析 本 题 考 查 思 修 第 八 章 中 国 人 权, 新 增 考 点 其 中 直 接 考 查 宪 法 保 障 是 人 权 保 障 的 前 提 和 基 础 A 人 权 保 障 的 最 后 防 线 是 司 法 保 障,B 人 权 保 障 的

) ) ) )-. ) ) / )-. )-. )-. -. : -/ -0 0/.. ; -.0 : 0 ).- ; 0 ).=? 2 2 ) / / ) - ; ) ; )/ :.0/10)/ / 34 ; )/ 10. ; / 0 )

! $%%& $%%#! " $%%# $%%& $%%& $%%# $%%& $%%#! "##$%%

"!""#!"#$!"""!""$ %&# #$(!""%!""& ) *+#,$ -.# % /&01!""(!" " &#(& ) 203,+," #$4,$ #5, %&# #$(!""%!""( #$!""# $ $!"#

SIK) 者, 需 實 施 1 年 以 上, 經 體 格 檢 查 無 後 遺 症 者 5. 身 體 任 何 部 分 有 刺 青 紋 身 穿 耳 洞 者, 不 得 報 考, 各 項 檢 查 結 果 須 符 合 體 位 區 分 標 準 常 備 役 體 位 二 在 校 軍 訓 成 績 總 平 均 70 分

Ps22Pdf

1-1 2

Transcription:

编译原理与技术 中间代码生成 2015/11/7 编译原理与技术 讲义 1

中间代码生成 - 布尔表达式翻译 - 控制流语句翻译 2015/11/7 编译原理与技术 讲义 2

布尔表达式的翻译 布尔表达式文法 G 4 E E 1 or E 2 E 1 and E 2 not E 1 ( E 1 ) id 1 relop id 2 true false id 3 布尔运算符 or and 和 not( 优先级 结合性 ) 关系运算符 relop:< = > 和 布尔常量 :true 和 false 布尔变量 :id 3 2015/11/7 编译原理与技术 讲义 3

布尔表达式的翻译 两种翻译方法 - 数值表示法 ( 完全计算 ) 类似算术表达式的翻译, 如布尔表达式 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 借助控制流语句的思路, 部分 ( 不完全地 - 用转移语句 ) 计算 布尔表达式的值以确定整个表达式的真 假 2015/11/7 编译原理与技术 讲义 4

数值表示法 布尔表达式的翻译 用 1 表示 true,0 代表 false (1)E E 1 or E 2 { t := newtemp; (2)E E 1 and E 2 (3)E not E 1 (4)E ( E 1 ) emit( t := E 1.place or E 2.place); E.place := t } 2015/11/7 编译原理与技术 讲义 5

数值表示法 (5)E id 1 relop id 2 { 布尔表达式的翻译 t:= newtemp; emit( if id 1.place relop.op id 2.place goto nextcode+3 ); emit( t := 0 ); emit( goto nextcode+2); emit( t := 1 ); E.place := t; } nextcode : emit 产生三地址语句的编号 ; 产生后, nextcode++ 2015/11/7 编译原理与技术 讲义 6

id 1 relop id 2 ( 关系表达式 ) i : if id 1 relop id2 goto i+3 i+1: false t := 0 true i+2: goto i+4 i+3: i+4: t := 1 2015/11/7 编译原理与技术 讲义 7

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

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

e.g.16 a<b or c=d and not e>f 的三地址码 : (100) if a<b goto 103 (101) t 1 := 0 (102) goto 104 (103) t 1 := 1 // 以上为 a<b 的翻译 (104) if c=d goto 107 (105) t 2 := 0 (106) goto 108 (107) t 2 := 1 // 以上为 c=d 的翻译 2015/11/7 编译原理与技术 讲义 10

e.g.16 a<b or c=d and not e>f 的三地址码 : (108) if e>f goto 111 (109) t 3 := 0 (110) goto 112 (111) t 3 := 1 // 以上为 e>f 的翻译 (112) t 4 := not t 3 // 以上为 not e>f 的翻译 (113) t 5 := t 2 and t 4 // 以上为 c=d and not e>f 的翻译 (115) t 6 := t 1 or t 5 // 以上为 a<b or c=d and not e>f 的翻译 2015/11/7 编译原理与技术 讲义 11

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

布尔表达式的翻译 短路计算 e.g.17 a<b or c=d and not e>f 的短路计算三地址码 : if a<b goto L_true goto L 1 L 1 : if c=d goto L 2 goto L_false L 2 : if e>f goto L_false goto L_true 2015/11/7 编译原理与技术 讲义 13

短路计算 true 真出口 false 真出口 E 1 or M E 2 not E 1 false false 假出口 true 假出口 false 假出口 true 真出口 E 1 and M E 2 ( E 1 ) 真出口 false 假出口 true true 2015/11/7 编译原理与技术 讲义 14

短路计算 true 真出口 true 真出口 id 1 relop id 2 false 假出口 true goto - if id 1 relop id 2 goto - goto - false false goto - 假出口 2015/11/7 编译原理与技术 讲义 15

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

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

短路计算及回填的翻译方案 (1) E E 1 or M E 2 { backpatch( E 1.falselist, M.code); E.truelist := merge( E 1.truelist,E 2.truelist); E.falselist := E 2.falselist; } (2) E E 1 and M E 2 { backpatch( E 1.truelist, M.code); E.falselist := merge( E 1.falselist,E 2.falselist); E.truelist := E 2.truelist; } 2015/11/7 编译原理与技术 讲义 18

(3) E not E 1 { E.truelist := E 1.falselist; E.falselist := E 1.truelist; } (4) E ( E 1 ) { E.truelist := E 1.truelist; E.falselist := E 1.falselist; } (5) E id 1 relop id 2 { E.truelist:=makelist(nextcode); emit( if id 1.place relop.op id 2.place goto -); E.falselist := makelist( nextcode ); emit( goto -); } 2015/11/7 编译原理与技术 讲义 19

(6) E true { E.truelist := makelist( nextcode ); emit( goto -); E.falselist := makelist(); } (7) E false { E.falselist := makelist( nextcode ); emit( goto -); E.truelist := makelist(); } 2015/11/7 编译原理与技术 讲义 20

控制流语句的翻译 描述控制流语句的文法 G 5 : (1) S if E then S 1 (2) S if E then S 1 else S 2 (3) S while E do S 1 (4) S for id := E 1 to E 2 do S 1 (5) S begin L end // compound statement (6) S A // 赋值语句 (7) L L 1 ; S // Statements List (8) L S 2015/11/7 编译原理与技术 讲义 21

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

条件语句的翻译 (1) (1) S if E then M S 1 { } backpatch( E.truelist, M.code ); S.nextlist := merge( E.falselist, S 1.nextlist ) 2015/11/7 编译原理与技术 讲义 23

条件语句的翻译 (2) if E then S 1 else S2 的代码结构 E.truelist M 1 S 1.nextlist E.code S 1.code t: goto - S 2.code E.falselist M 2 在代码标号 t 处强制产生无条件转移代码, 转移目标待回填 S 2.nextlist? 未知目标地址 2015/11/7 编译原理与技术 讲义 24

条件语句的翻译 (2) (2) S if E then M 1 S 1 N else M 2 S 2 { backpatch( E.truelist, M 1.code ); backpatch( E.falselist, M 2.code ); S.nextlist := merge( S 1.nextlist, S 2.nextlist, N.code) ; } N ε { N.code := makelist(nextcode); // 标号 t emit( goto -); } 2015/11/7 编译原理与技术 讲义 25

循环语句的翻译 (1) while E do S 1 的代码结构 M 1 M 1 : E.truelist M 2 S 1.nextlist E.code S 1.code goto M 1 E.falselist 产生无条件转移语句 goto M 1 ( 跳转至循环条件测试代码开始处 ) 未知目标地址? 2015/11/7 编译原理与技术 讲义 26

循环语句的翻译 (1) (3) S while M 1 E do M 2 S 1 { backpatch( E.truelist, M 2.code ); } backpatch( S 1.nextlist, M 1.code ); S.nextlist := E.falselist; emit( goto M 1.code ); 2015/11/7 编译原理与技术 讲义 27

循环语句的翻译 (2) for id := E 1 to E 2 do S 1 的代码结构 id := E 1.place 待回填的目标地址 t: if id > E 2.place goto - FALSE TRUE S 1.code S 1.nextlist id := id + 1? 未知目标地址 goto t 2015/11/7 编译原理与技术 讲义 28

循环语句的翻译 (2) (4) F for id := E 1 to E 2 do { p := lookup( id.name ); F.place := p; emit( id := E 1.place ); t := nextcode // 标号 t F.again := t; F.falselist := makelist( t ) ; emit( if p > E 2.place goto -); } S F S 1 { t := nextcode; emit( F.place := F.place + 1); emit( goto F.again); backpatch( S 1.nextlist, t ); S.nextlist := F.falselist; } 2015/11/7 编译原理与技术 讲义 29

循环语句的翻译 (3) 如何翻译 C 语言的 for 语句? S for ( E 1 ; E 2 ; E 3 ) S 1 2015/11/7 编译原理与技术 讲义 30

文法 G 4 中其它语句的翻译 (5) S begin L end { S.nextlist := L.nextlist } (6) S A { S.nextlist := makelist();//empty } // A- 表示赋值语句 ; (7) L L 1 ; M S { backpatch( L 1.nextlist, M.code); L.nextlist := S.nextlist ; } (8) L S { L.nextlist := S.nextlist } 2015/11/7 编译原理与技术 讲义 31

CASE/SWITCH 语句的翻译 (0) (9) S switch E begin case C 1 : S 1 ; case C 2 : S 2 ; case C n-1 : S n-1 ; default : S n ; end 2015/11/7 编译原理与技术 讲义 32

E.code t: goto test ( 待回填 ) L i : S i.code t i : goto next ( 待回填 ) CASE/SWITCH 语句代码结构 test : if E.place = C 1 goto L 1 if E.place = C 2 goto L 2 if E.place = C n-1 goto L n-1 goto L n next: 2015/11/7 编译原理与技术 讲义 33

CASE/SWITCH 语句的翻译 (1) (1) 分析完 SWITCH E 产生 E.code t: goto test ( 待回填 ) (2) 分析完一个 case C i : S i 产生如下代码, 并将标号 L i 和常量 C i 保存到 case 情况常量表 L i : S i.code t i : goto next ( 待回填 ) 情况常量表常量标号 C 1 L 1 C i L i... - L n SWITCH 中 default 2015/11/7 编译原理与技术 讲义 34

CASE/SWITCH 语句的翻译 (2) (3) 分析完 end(switch 结束 ), 此时可以查看情况常量表产生如下代码, 并将标号 test 回填到包含 t 处的转移代码中 合并所有 S i.nextlist 和标号 t i 即为 SWITCH 语句的 nextlist test : if E.place = C 1 goto L 1 next: if E.place = C 2 goto L 2 if E.place = C n-1 goto L n-1 goto L n 情况常量表常量标号 C 1 L 1 C i L i... - L n 2015/11/7 编译原理与技术 讲义 35

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; 2015/11/7 编译原理与技术 讲义 36

e.g.17 控制流语句的翻译 L 2 L 1 ; S 5 S 4 A 3 if E 1 then S 2 else S 3 while E 2 do S 1 A 2 A 1 2015/11/7 编译原理与技术 讲义 37

e.g.17 控制流语句的翻译 一 翻译 E 1 :( 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 } 2015/11/7 编译原理与技术 讲义 38

e.g.17 控制流语句的翻译 二 翻译 S 2 :while E 2 do S 1 (106) if a>c goto 108 // 用 108 回填 (106) (107) goto 112 (108) c := c + 1 // S 1 A 1 S 1.nextlist={} (109)goto 106 // 转至循环入口 (106) S 2.nextlist: { 107 } (110) goto 112 // 由 N ε 生成 (111) d := d + 1 // S 3 A 2 S 3.nextlist={} 2015/11/7 编译原理与技术 讲义 39

e.g.17 控制流语句的翻译 三 分析完 S 4 用 106 回填 (100) 和 (104); 用 111 回填 (103) 和 (105) S 4.nextlist: { 107, 110 } 四 分析完 L 1 L 1.nextlist: { 107, 110 } 五 分析 S 5 (112) e := e + d // S 5 A 3 S 5.nextlist={} 2015/11/7 编译原理与技术 讲义 40

e.g.17 控制流语句的翻译 六 分析完 L 2 用 112 回填 (107) 和 (110) L 2.nextlist: {} 2015/11/7 编译原理与技术 讲义 41

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 2015/11/7 编译原理与技术 讲义 42

e.g.18 Linux 下 C 语言控制流语句的翻译 1)if 语句 2)for 语句 3)do-while 语句 2015/11/7 编译原理与技术 讲义 43