编译原理基础——习题与上机题解答课件作者刘坚第1-5章节第5章节.pptVIP

编译原理基础——习题与上机题解答课件作者刘坚第1-5章节第5章节.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
  5.1 静态分配策略对语言有哪些限制?栈分配策略对语言有哪些限制?   解:   静态分配策略对语言的限制是:   ① 名字的绑定是1对1的关系;   ② 数据对象的大小在编译时确定;   ③ 不允许过程递归调用;   ④ 不允许存储空间的动态分配和释放。   栈分配策略对语言的限制是:   ① 当活动停止时,局部于该活动的名字的值不能保持;   ② 不允许存储空间任意地动态分配和释放;   ③ 调用者和被调用者的生存期必须满足,后被调用先退出。   5.2 有过程p和函数max定义如下:    proc max ( a, b : integer ) : integer ;    begin if a b then return b else return a; end;    proc p ;    x, y : integer;    begin x := 3; y := 5; x := max ( x, y ); end;   (1) 请写出p与max之间的调用序列与返回序列;   (2) 请画出p与max各自的活动记录,列出活动记录中所有可以确定的内容。   (提示:过程定义中没有嵌套,活动记录中可以没有访问链,此时,控制链的地址作为本地数据寻址的基础。)   解:   首先做下述假设:   ① 值调用方式进行参数传递,忽略参数传递的实现细节;   ② 忽略机器状态保存与恢复的处理;   ③ ?p活动记录的大小设为Lp,max活动记录的大小设为Lmax;   ④ 活动记录中的内容安排如题5.2图(a)所示(事实上,活动记录中内容的安排是根据具体应用而定的,此处仅是一个例子而已,其中的安排并不一定合理),其中任何数据对象均占据一个存储单元。   (1)? p与max之间的调用序列和返回序列如下表。    (2)? p调用max之前和p调用max之后的栈顶分别如题5.2图的(b)和(c)所示。 题5.2图 (a) 活动记录内容安排;(b)? p调用max之前的栈顶; (c)? p调用max之后的栈顶   5.3 试解释为什么在程序运行的任何时刻,均可以通过控制链进行活动记录的正确切换,并且均可以通过访问链正确访问非本地数据。   解:   (1) 通过控制链进行活动记录的切换:控制链中存放的是调用者活动记录的指针(内存地址)。以A调用B为例,当调用发生时,调用序列把B的活动记录加入到控制栈的栈顶,修改栈顶指针指向B的活动记录,并且在B的控制链域中放入A的活动记录指针,这样当前的活动记录就从A切换到B; 反之,当调用返回时,返回序列根据B中控制链中存放的A的活动记录指针把栈顶指向A的活动记录,弹出B的活动记录,并且恢复调用发生前的机器状态,这样当前的活动记录就从B切换到A。    (2) 通过访问链访问非本地数据:访问链指向当前活动的过程的最新直接外层过程的活动记录。若当前活动的过程x的嵌套深度为nx,则x活动记录中的访问链指向的活动记录的过程的嵌套深度为nx–1。即沿访问链追踪一次,活动记录对应过程的嵌套深度浅一层。考虑在过程a中调用过程b中的某变量x。 设na和nb分别是过程a和b的嵌套深度(注意:nx=nb),由作用域规则可知,必有na≥nb,于是根据公式(5.1)(教材,P160),从当前层次na沿访问链追踪na–nb次,到达na–(na–nb)=nb层,即x所在的活动记录。   5.4 设过程p和过程q的嵌套深度分别为np和nq,试证明,无论是npnq还是np≥nq,本章所讨论的显示表维护方法均能正确工作。   解:   显示表中的每个元素d[i]实质上是一个栈式链表,将所有在生存期的、嵌套深度为i的活动的活动记录链起,最新被调用的活动记录在栈顶。过程调用和返回时显示表的维护仅与当前在控制栈顶的活动记录有关,而与调用者和被调用者的嵌套关系无关。 因此只需证明任何一个嵌套深度为i的过程在它被调用时和返回时d[i]可以被正确维护。   (1) 被调用时的维护过程:   ① 将d[i]的值保存在新活动记录(被调用者的活动记录)的访问链中,并且   ② 置d[i]指向新的活动记录(置d[i]内容为被调用者活动记录的sp)。   (2) 过程返回时的维护过程:   将被调用者活动记录访问链中的内容拷贝回d[i]。   考察调用嵌套深度为i的过程a和从过程a返回时d[i]的变化过程:设调用a之前d[i]的内容是过程b的活动记录的spb,根据显示表的内容可知,b的嵌套深度为i,且是所有嵌套深度为i的、在生存期的活动中最新被调用的。调用a之后,经过上述维护过程(1),spb被放在了a活动记录的访问链中,而d[i]的内容被更改为spa,即d[i]仍然指向嵌套深度

您可能关注的文档

文档评论(0)

时间加速器 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档