- 1、本文档共67页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理第七章概要
* 5.5 CASE语句的翻译 CASE语句的语法结构: case E of C1: S1 ; C2: S2 ; … Cn-1 Sn-1; otherwise:Sn end goto test L1: S1的代码 goto next L2: S2的代码 goto next … Ln: Sn的代码 goto next test: if T= C1 goto L1 if T= C2 goto L2 … if T= Cn-1 goto Ln-1 goto Ln next: L1: if T≠C1 goto L2 S1的代码 goto next L2: if T≠C2 goto L3 S2的代码 goto next … Ln-1: if T≠Cn-1 goto Ln Sn-1的代码 goto next Ln: Sn的代码 next: 方法一 方法二 * 本章教学线索 1 中间语言 2 说明语句 3 赋值语句的翻译 4 布尔表达式的翻译 5 控制语句的翻译 6 过程调用的处理 * 6 过程调用的处理 ◆ 一个过程调用的翻译包括一个调用序列,即进入和离开每一个过程所采取的动作序列。 ◆ 考虑如下的一个简单的过程调用语句的文法: (1) S→call id (Elist) (2) Elist→Elist,E (3) Elist→ E 发生一个过程调用时: 为被调用过程分配它的活动记录的存储空间; 把实在参数的信息传递到被调用过程的可取的指定位置; 建立环境指针以便被调用过程能存取非局部过程的数据; 保留调用过程的运行状态; 返回地址应存入指定的单元中; 应生成一条转移指令转移到被调用过程代码的开始位置。 * 6 过程调用的处理 从过程返回时: 如果被调用过程是一个函数,则需将返回的结果值存放在一个指定的位置上; 调用过程的活动记录需要恢复; 应生成一条转移指令转移到调用过程的返回地址; 例子:过程调用 “call i(a+b, c)” 代码如下: 计算a+b置于单元t中 /* t:= a+b */ param t /* 第一个实参地址*/ param c /*第二个实参地址*/ call i.Place,2 /*调用过程i */ * 6 过程调用的处理 过程调用的翻译模式: S→call id(Elist) { for 队列queue中的每一项P do emit(‘param’ P); emit(‘call’ id.place)} Elist→Elist,E {将E.place加入到queue的队尾} Elist→E {初始化queue,仅包含E.place} 如:call S(A+B,Z) param T param Z call S * 数组元素引用的文法 L→ id [Elist] | id //*****数组名在形成L时与Elist联系 Elist→Elist,E | E 为了在分析下标表达式中始终知道有关数组名的信息,改写为: L→Elist] | id Elist→Elist,E | id[ E //****数组名与数组最左下标表达式联系 Elist可以产生k维数组引用的前m维下标,并生成: (…((i1n2+i2)n3+i3)…)nm+im 则有递归公式:e1= i1 ,em=em-1*nm+im 对于m=k时,ek*w即为计算数组元素相对地址的变量部分。 有关变量与函数的说明 Elist.ndim:记录Elist中的下标表达式的个数,即维数; limit(array,j):返回nj,即由array所指示的数组的第j维长度; Elist.place:用来临时存放由Elist中的下标表达式计算
文档评论(0)