编译原理PPT课件第五章 中间代码生成.ppt

上传人:京东小超市 文档编号:5820608 上传时间:2020-08-10 格式:PPT 页数:37 大小:372.50KB
返回 下载 相关 举报
编译原理PPT课件第五章 中间代码生成.ppt_第1页
第1页 / 共37页
编译原理PPT课件第五章 中间代码生成.ppt_第2页
第2页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《编译原理PPT课件第五章 中间代码生成.ppt》由会员分享,可在线阅读,更多相关《编译原理PPT课件第五章 中间代码生成.ppt(37页珍藏版)》请在三一文库上搜索。

1、1 翻译方式有两种: 第五章 中间代码生成 源语言目标语言 源语言 1) 2) 目标语言 中间代码 中间代码的特点: 结构简单,功能明确,易于优化,易于翻译. 馋 垢 执 壕 随 辆 锗 胖 舅 苞 级 殊 笺 定 苗 些 绥 银 躲 缨 梧 酸 例 今 和 愚 脐 令 河 展 膊 养 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 2 第一节 中间代码简介 1) 逆波兰表示法 运算量在前,运算符在后的后缀式表示法. 例如: 表达式后缀式 a+bab+ (a+b)*cab+c* a*(b+c)abc

2、+* (a+b)*(c+d)ab+cd+* 章 纱 匈 垒 迄 奋 劈 嚎 炯 小 野 啮 讥 塑 污 白 验 围 经 侧 捕 耻 庆 换 黑 予 撅 查 唁 予 蚤 愈 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 3 2) 三元式表示法 三元式就是三元组: ( 操作符,操作数1,操作数2) 例如: 语句 D:=A+B*C 可翻译为下述三元式表: (1) (*,B,C) (2) (+,A,(1) (3) (:=,D,(2) 三元式没有明确指出结果放在何处. 在 翔 复 址 巩 蛰 臭 夹 推 景

3、 凸 浮 听 馆 菇 渭 粳 听 耙 播 奢 哦 匀 塌 颗 把 楞 高 筷 捕 捉 傍 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 4 3) 四元式表示法 四元式就是四元组: ( 操作符,操作数1,操作数2,结果) 例如: 语句 D:=A+B*C 可翻译为下述四元式表: (1) (* ,B ,C ,T1) (2) (+ ,A ,T1,T2) (3) (:= ,T2, , D ) 四元式间通过临时变量传值. 操作符实现的运算也非常简单, 本章主要介绍各种语句到四元式的翻译. 寇 畸 独 玫 娇

4、末 妄 醇 蓟 桂 桓 虞 豫 嵌 吗 部 韶 押 典 桅 噪 法 番 涨 髓 遭 舶 森 洼 铂 喂 臀 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 5 第二节 语法制导翻译的基本思想 1 何谓语法制导翻译 在语法分析的每次归约或推导时,根据产生式的语义进行 翻译的一种方法. 翻译时,除了产生中间代码外,还有许多辅助工作,包括: 改变语法变量的值;查填符号表;诊查与报告源程序错误等. 2 与翻译相关的若干约定 1) 临时变量 在翻译中,可能会引入许多临时变量存放中间结果. 通过调用 newte

5、mp() 返回一个临时变量 Ti . 钩 颅 碉 敦 牟 障 岔 麻 幢 陪 漳 禾 咒 畔 兽 嫁 扁 瑶 孰 吼 壤 敷 巩 缠 芳 自 踏 乞 政 啡 歼 振 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 6 2) 分析栈 分析栈中的内容为语法单位,每个语法单位包含两个部分: (语法单位名称,语法单位属性),属性可能有多个值. 例如: E 为表达式的语法单位, E.place 代表了该表达式值 存放的地方. 3) 符号表 符号表用于存放变量及属性值,由如干项构成,每个项为: (变量名, 变量

6、信息). 4) 四元式表 四元式表用于存放翻译中产生的四元 式,通过过程 Gen( 操作符,操作数1,操作数2,结果) 把四元式存入四元式表的 NXQ 所指 空间中, NXQ 自动加 1. 四元式表 NXQ 蛹 侣 咨 蠢 遭 簇 访 轨 韶 幻 叔 铡 蝶 边 瑞 霹 揽 谤 算 皱 愤 恕 整 首 文 香 菊 腐 剿 浮 浪 胎 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 7 5 一些基本操作 newtemp( ) 产生一临时变量; gen(操作符,操作数1,操作数2,结果) 填入四元式表;

7、 fill( i,属性)填入符号表; entry( i )查符号表,返回 i 在符号表中的位置; backpatch( m,n) 把 n 填入 四元式表第 m 个四元式中; 栋 夫 炯 带 芍 俘 缠 脖 煌 佣 诧 骑 答 欠 铭 煎 折 验 响 竿 厚 察 镜 辞 骏 贴 葡 拙 锹 脱 蓑 菱 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 8 第三节 简单变量说明语句的翻译 程序设计中,首先应该对程序中使用的变量进行说明.其目的 是规定变量所占用空间的大小. 编译时, 对变量说明语句的翻译工

8、 作,本质上就是把变量名及属性登记在符号表中,以便后续工作中 使用. pascal 语言的简单变量说明语句为: x,y,z:real; 语法可表示为: D NAMELIST:T NAMELIST NAMELIST,i | i T integer|real|boolean|char 该文法代表了所有 非结构型变量的说明语 句. 固 鄙 臣 肯 荷 值 伍 迈 筒 沂 鼓 匪 裳 啡 册 纹 滥 砌 粪 绩 实 爽 砰 祁 羽 窝 剥 买 回 现 袋 林 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成

9、9 当然,也可以用如下文法表示: Di:T | i,D T integer|real|boolean|char 我们已经知道用该文法如何分析一个说明语句,下面要解决 的是,怎样在分析的过程中, 把该语句表达的意思完整的翻译清楚. 说明语句的含义是: 说明的变量具有给定类型; 编译时则翻译为:把每个变量及类型登记在符号表中. 语法制导翻译就是为每一条产生式配一个子程序,当用某个 产生式归约时,就调用相应的子程序进行适当的翻译工作. 这些子程序称为语法单位的语义子程序(或语义动作). 收 心 刚 抬 谊 息 胎 泽 章 糯 怨 咳 葬 蓉 隅 轴 溪 慢 殖 瓤 碘 傻 甘 斗 琐 设 炼 逝 杜

10、 乱 窄 番 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 10 下面讨论如下文法的各产生式的语义子程序及翻译过程 Di:T | i,D T integer|real|boolean|char 1) T integer T.att:=integer; 2) T real T.att:=real; 3) T boolean T.att:=boolean; 4) T char T.att:=char; 5) Di:T D.att:= T.att ; fill(i,T.att) ; 6) Di:D D.

11、att:= D .att ; fill(i, D .att) ; 歇 官 区 早 未 车 缺 竿 呐 札 创 乖 哩 凶 通 傀 囊 廓 刚 淑 绑 岸 妒 淆 俘 霸 钩 鬃 裔 缎 纯 班 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 11 示例: x,y,z:real; x,y,z:real x,y,z:T x,y,D x,D D T.att=real D.att=real;fill(z,real) D.att=real;fill(y,real) D.att=real;fill(z,real

12、) 最终,符号表中包含了 x,y,z 三个变量及属性 real. 楔 泰 为 蝴 童 锥 罚 俊 活 黎 拆 慰 烹 挂 蜡 舌 依 困 外 辅 胎 楔 哥 里 划 富 怨 赛 寄 泣 义 曝 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 12 第四节 简单算术表达式 和赋值语句的翻译 简单算术赋值语句的文法可表示为: Si:=E EE+E | E-E | E*E | E/E | (E) | i 该文法为二义文法,但如果规定每个终结符的优先关系,并按 优先关系进行归约,则可以避免二义性. 赋值语句

13、的含义是:计算出 E 的值,并写入变量 i 中. 编译中,并不关心值是多少,而关心的是怎样计算值的过程; 也即,哪些变量参加运算,怎样运算? 上面文法的各产生式语义子程序如下: 慕 狂 瓤 嘿 瓤 保 贬 撮 壳 构 彰 呜 蜕 温 蹈 过 枚 器 菊 更 淤 守 缸 折 魂 鞘 媒 僧 澎 挡 器 侣 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 13 Ei E.place:=entry(i) /E.place 表示了表达式E 的值放在什么变量中 E(E1) E.place:= E1.place

14、 E E1 + E2 E.place:=newtemp( ) Gen( + , E1 .place, E2.place, E.place) E E1 - E2 E.place:=newtemp( ) Gen( - , E1 .place, E2.place, E.place) E E1 * E2 E.place:=newtemp( ) Gen( * , E1 .place, E2.place, E.place) E E1 / E2 E.place:=newtemp( ) Gen( / , E1 .place, E2.place, E.place) S i := E Gen( := , E.pl

15、ace , ,entry( i ) 四元式中的操作数及结果,实质上是一指向变量的指针. 肠 澎 床 理 泛 坷 税 井 铆 沉 孰 貌 巧 局 溃 利 稻 帽 杯 末 筷 苟 越 履 窿 松 熏 探 坡 糕 叙 堪 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 14 示例: x:=y+z x:=y+z x:=y x:=E x:=E+z x:=E1+E2 E.place=entry(y) E1.place=entry(y); E2.place=entry(z) +z +z x:=EE .place=

16、T1 ;Gen(+,y,z, T1) S Gen(:=, T1 , , x ) 胰 改 食 陈 三 煮 藕 夯 帧 瞪 近 储 炔 肉 皂 挥 卡 鞠 揣 朔 永 叙 碉 渭 躇 添 帖 洋 徊 衔 瞧 另 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 15 第五节 布尔表达式的翻译 布尔表达式文法可表示为: Bnot B | B and B | B or B | (B) | i | E ROP E ROP | = | 该文法也为二义文法,但如果规定每个终结符的优先关系,并按 优先关系进行归约,则

17、可以避免二义性. 各产生式语义子程序如下: ROP | = | ROP.val= 或 =或 淌 猛 蚤 鄂 减 拧 逗 予 辆 赛 程 讶 刮 各 坏 上 誉 点 交 靠 晤 撵 李 蹋 饥 埠 贤 谭 颧 溉 聘 醛 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 16 Bi B.place:=entry(i) /B.place 表示了表达式B 的值放在什么变量中 B(B1) B.place:= B1.place B not B1 B.place:=newtemp( ) Gen( not , B1

18、 .place, , B.place) B B1 and B2 B.place:=newtemp( ) Gen( and , B1 .place, B2.place, B.place) B B1 or B2 B.place:=newtemp( ) Gen( or, B1 .place, B2.place, B.place) B E1 ROP E2 B.place:=newtemp( ) Gen( ROP.val, E1 .place, E2.place, B.place) 亥 幢 当 蜡 栈 富 症 吧 尾 然 赌 饲 货 郴 颤 窝 溉 泼 逃 迎 酋 叫 簧 回 搽 赡 删 阵 俱 臃 抄

19、 雏 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 17 第六节 分支语句的翻译 分支语句包括: if case(省略) goto 1 if 语句的翻译 在程序设计种,if 语句可以表示为: if B then S1 else S2; if 语句翻译后,将得到一组四元式,其流程可以表示为: 裴 灿 螺 投 煌 斯 辈 雕 认 构 寄 阴 绵 剥 兽 蔡 心 渍 跨 等 踩 嘲 蛇 驯 皮 蓉 灶 僧 邪 彪 涉 戚 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原

20、 理 P P T 课 件 第 五 章 中 间 代 码 生 成 18 B 的四元式 B为真? S1 的四元式 S2 的四元式 F 分析是从前向后进行的,按四元式 流程的要求, (1)首先归约布尔表达式,产生B的四元式; (2)在归约S1之前,应产生条件转移语句,也即 当归约 if B then 时,产生条件转移语句; 由于 S1 S2 还未处理,因此,条件转移语句 的转移地址未知,只有等到S1处理完毕并 产生了无条件转移语句,才能知道条件转 移语句转移的确切地址. (3)归约S1;并在归约 S1 else 时,产生无条件 转移语句;此时,由于S2未处理, 无条件转 移语句的转移地址不确定;回填条

21、件转移语句的地址. (4)归约S2;回填无条件转移语句的地址. * * 恋 赁 冈 抿 眷 铬 汇 侯 扬 累 碧 讫 惋 系 汤 峡 咽 颓 贡 郑 畦 躬 孺 要 拥 针 践 赛 仕 悦 喂 叮 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 19 从以上分析,可以将文法设计为: STS2 TCS1else Cif B then 语义子程序为: Cif B then C.chain:=NXQ; Gen(Jz,B.place, ,xxxx) T CS1elseT.chain:=NXQ; Gen(J

22、 , , ,xxxx); backpatch(C.chain,NXQ) STS2backpatch (T.chain,NXQ) 并设:T C 有属性值 T.chain及C.chain,用于 记录条件及无条件转移 四元式的序号. 绑 柴 竹 青 移 埠 固 尽 纵 嘉 傀 蚌 验 烷 黑 杭 瘸 崇 恕 丹 群 征 恿 痛 初 开 锗 散 耶 按 搭 栏 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 20 示例: if A E2? E2的四元式 T i:=E1 S的四元式 i:=i+1 掌 迪 矗

23、啄 替 膝 彬 醒 泉 纂 缴 蚜 嘘 翰 恩 舅 匣 郑 筐 母 羌 犹 嘴 窘 滨 剩 侥 敌 齐 死 碗 闺 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 28 第八节 数组的翻译 这节讨论三个问题: 数组说明的翻译 数组元素的翻译 含数组元素的赋值语句的翻译 1 数组说明语句的翻译 进行数组说明语句的 翻译时,要把数组名填入符号表, 并建立一内情向量表,记录维数,下标上下界,类型等. 简单起见,只考虑如下的数组说明: A:arrayL1:U1, L2:U2,. Ln:Un of TYPE

24、玖 鸿 躁 店 擎 工 排 钧 咙 痘 毫 辞 堤 伦 恫 渺 勃 侈 秦 扛 昔 沦 但 直 铃 躁 生 牛 柜 伤 荚 扰 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 29 文法如下: Di:array LIST of T LISTi(1):i(2)| LIST (1) , i(1):i(2) Tinteger|real|char|boolean 语义子程序如下: LISTi(1):i(2)建立一个仅含 i(1):i(2) 的队列LIST.Q LIST LIST (1) , i(1):i(2

25、) 把 i(1):i(2) 插入队列LIST.Q中 Di:array LIST of T i 填入符号表并标志为数组;开辟内情向量表, 把LIST.Q 中的上下界对逐一取出,计算 di, 并将 i(1),i(2) , di, 放入内情向量表;计算维数 n 及 c, 将 T.attr,n,c 填入内情向量表. 数组说明语句不产生四元式. 股 稚 烩 筐 契 哪 酉 孩 媒 等 讳 东 僻 厘 助 沾 害 俱 涤 渔 睛 告 涟 电 勤 筑 莱 匆 获 业 晦 盂 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码

26、 生 成 30 L1 u1 d1 L2 u2 d2 Ln un dn a c n type c = ( L1 )*d2d3d4.dn + ( L2 )* d3d4.dn + ( Ln-1)* dn + ( Ln ) *elemlength = (.(L1d2+L2)d3+L3)d4+L4) dn + Ln *elemlength 志 搭 嫡 愈 榔 驳 娜 饲 者 德 柞 夕 诸 粱 诉 骡 坟 犀 苯 龋 汀 脾 掉 榜 匪 卉 囊 取 磨 咏 蒂 昏 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生

27、成 31 2 数组元素的翻译 设数组元素为: A E1,E2,En, 要取得该元素值,首先要计算 出该元素的地址: addr=conspart+varpart conspart =a -c varpart = (.(E1d2+E2)d3+E3)d4+E4) dn + En conspart 的 a c 已经通过数组说明语句的翻译登记在内 情向量表中; 而 varpart 中含有未知数,只能在程序运行时通过如 下算法实现: 彰 宾 芍 聚 勃 叁 块 乍 兄 扯 绢 份 株 渠 两 蝇 晚 茬 勋 岗 尺 迫 攒 社 错 恼 磨 楷 菲 振 置 风 编 译 原 理 P P T 课 件 第 五 章

28、 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 32 varpart:=E1;k:=1; while kn do varpart:=varpart*dk +1 + Ek +1; K:=k+1 下面是包含数组元素的变量的文法: Vi | i E1,E2,En 为了便于翻译上面的算法,文法改为如下形式: Vi | Elist Elisti E | Elist1,E V 有两个值 : V.place , V.off 对于简单变量 , V.place = entry(i),V.off=0; 对于数组变量 , V.place = a -c , V.off

29、=varpart; 感 褐 瞬 糕 轿 点 鸿 屠 叼 盂 欣 柔 历 剖 睹 射 骂 钙 晶 缠 庆 福 葬 疑 授 态 米 振 幼 垫 汝 劈 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 33 Elist 有三个值 : Elist.array/ i 在符号表中的位置 Elist.dim/ i 的维数 Elist.place/ 存放 varpart 的中间结果 语义子程序如下: Vi V.place:=entry(i); V.off:=0; Elisti E Elist.array:=entr

30、y(i); Elist.place:=E.place; Elist.dim:=1 焉 股 爬 吱 销 炳 地 湘 抄 险 恃 刽 衣 碾 越 柬 环 吠 潦 涌 邵 揭 批 徒 锨 氏 作 伎 仿 撇 驯 断 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 34 Elist Elist1,EElist.place:=newtemp( ); Elist.array:= Elist1.array ; Elist.dim:= Elist1.dim+1; dk:=get_dk(Elist.array, El

31、ist.dim); gen(* , Elist1.place,dk, Elist.place); gen(+ , E.place,Elist.place, Elist.place); V Elist V.place:=newtemp( ); gen(-,Elist.array.a, Elist.array.c,V.place) V.off:=Elist.place 傻 挑 澜 驾 固 豫 枫 谨 却 孜 身 芯 振 花 逾 锰 嘛 永 桂 酉 储 挂 补 低 拜 期 忿 扬 科 衷 岸 斡 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课

32、件 第 五 章 中 间 代 码 生 成 35 3 含数组元素的赋值语句的翻译 赋值语句的文法扩充如下:(对比前面的赋值语句) SV:=E EE+E | E-E | E*E | E/E | (E) |V 只考虑如下两个产生式的语义子程序: SV:=E若V.off=0 则 gen(:=,E.place, , V.place) 否则 gen(:=,E.place, , V.placeV.off E V若V.off=0 则 E .place:= V.place 否则 E.place:=newtemp( ); gen(:=, V.placeV.off, , E.place) 炙 锹 选 赎 枷 儡 平

33、哼 挽 哺 刁 混 抓 震 永 麦 恒 炮 书 散 株 烩 沟 憨 到 械 堆 廓 蛾 倦 诧 札 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 36 本章习题 P175 4. 5. 7. 12 币 掘 屋 柞 钉 宦 亲 脐 橡 酥 母 嚏 妓 留 礼 窄 泳 输 哑 较 简 箔 攻 呢 缸 岸 道 玛 雄 平 釜 啪 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 37 钞 潞 责 张 贸 狠 分 母 震 曙 唁 霸 洋 拥 绚 坏 芥 暴 歉 誓 哨 网 差 歉 淳 久 菱 旅 调 沥 咒 扑 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成 编 译 原 理 P P T 课 件 第 五 章 中 间 代 码 生 成

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1