- 1、本文档共77页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6编译原理之中间代码生成
控制转移语句的回填(3) Break、Continue的处理 虽然break、continue在语法上就是一个句子,但是它的代码却和外围语句相关。 方法: 跟踪外围语句S, 生成一个跳转指令坯 将这个指令坯的位置加入到S的nextlist中。 跟踪的方法 在符号表中设置break条目,令其指向外围语句 在符号表中设置指向S的nextlist的指针,然后把这个指令坯的位置直接加入到nextlist中。 6.8 switch语句 许多语言都有“switch”或“case”语句 语句结构 switch (E) of { case V1:S1; case V2:S2; … case Vn-1 : Sn-1; otherwise: Sn } switch语句的翻译 计算表达式E的值。 在case列表中寻找与表达式值相同的值Vj。当case表中明确列出的值都不与表达式匹配时,就用默认值和表达式匹配。 执行和匹配值关联的语句Sj。 其中步骤2是一个n路分支,可采用多种方式实现。 实现条件跳转的方式 创建一个对照关系表 编译器生成一个简单循环,检查表达式E的值 当匹配某个Vi时,执行对应的Si 均不匹配时,肯定与末项匹配 实现条件跳转的方式 散列表 当值的个数超过10个或更多时的一种更高效的方法 符号表(散列表) 队列。 Pi是Li在 符号表中 的位置 翻译法(一): T:=E L1: if T?V1 goto L2 S1的代码 goto next L2: if T?V2 goto L3 S2的代码 goto next L3: … Ln-1: if T?Vn-1 goto Ln Sn-1的代码 goto next Ln: Sn的代码 next: 翻译法(二): 计算E并放入T中的代码 goto test L1: 关于S1的中间码 goto next … Ln-1: 关于Sn-1的中间码 goto next Ln: 关于Sn的中间码 goto next test: if T=V1 goto L1 if T=V2 goto L2 … if T=Vn-1 goto Ln-1 goto Ln next: 用来翻译switch语句的case三地址代码指令 Case t V1 L1 Case t V2 L2 … Case t Vn-1 Ln-1 Case t t Ln next: 过程的中间代码 在三地址码中,函数调用被拆分为准备进行调用时的参数求值,然后是调用本身。 过程调用的处理 过程调用主要对应两种事: 传递参数 转子 传地址:把实在参数的地址传递给相应的形式参数 调用段预先把实在参数的地址传递到被调用段可以拿到的地方; 程序控制转入被调用段之后,被调用段首先把实在参数的地址抄进自己相应的形式单元中; 过程体对形式参数的引用域赋值被处理成对形式单元的间接访问。 翻译方法:把实参的地址逐一放在转子指令的前面. 例如, CALL S(A,X+Y) 翻译为: 计算X+Y置于T中的代码 param A /*第一个参数的地址*/ param T /*第二个参数的地址*/ call S,2 /*转子*/ 过程调用的翻译 过程调用文法: (1) S → call id (Elist) (2) Elist → Elist, E (3) Elist → E 参数的地址存放在一个队列中 最后对队列中的每一项生成一条param语句 翻译模式 3. Elist→E { 初始化queue仅包含E.place;n=0 } 2. Elist→Elist, E { 将E.place加入到queue的队尾;n=n+1 } 1. S→call id (Elist) { for 队列queue中的每一项p do gen(‘param’ p); gen(‘call’ id.addr ‘,’ n) } * 8跟数组a的元素大小有关 * 在许多语言中,隐式转换限于拓宽类型转换 * * * * * * * * * * * L:语句列表 A:赋值语句 * * * * * * 当看到基本字CASE时,产生标号test,next和一个临时单元T.计算E并放入T中,看到of时,生成一个goto test的四元式,然后设置一个空队列queue.当遇到ci时,产生一个标号li,把它连同nextquad填入符号表,然后把(ci,pi)排在队列末尾。 增量式翻译方案 主属性
您可能关注的文档
- 69.肖新概念英语第一册137-138课课件.ppt
- 6.蜗牛的奖杯.ppt
- 6B复习课(一般现在时).ppt
- 6sigma概述39页.ppt
- 6SIGMA工作研讨.ppt
- 6S 品质 环境 HSPM管理体系.ppt
- 6.耳鼻喉解剖及耳部疾病护理.ppt
- 6_商务谈判策略.ppt
- 604班家长会.ppt
- 6_古代世界的战争与征服.ppt
- 高考生物一轮复习讲练测第25讲 神经调节(第一课时,神经调节的结构基础及基本方式)(练习)(解析版).docx
- 高考生物一轮复习讲练测第16讲 自由组合定律(第二课时)(练习)(原卷版).docx
- 2025高考政治二轮复习专题练习:专题一 人类社会发展与中国特色社会主义(含解析).docx
- 高考生物一轮复习讲练测第四单元 细胞的生命历程(测试)(解析版).docx
- 高考生物一轮复习讲练测第25讲 神经调节(第二课时,神经冲动的产生和传导、神经系统的分级调节和人脑的高级功能)(讲义)(解析版).docx
- 高考生物一轮复习讲练测第七单元 生物的变异和进化(测试)(原卷版).docx
- 高考生物一轮复习讲练测第22讲 生物的变异(第一课时,基因突变和基因重组)(练习)(原卷版).docx
- 高考生物一轮复习讲练测第四单元 细胞的生命历程(测试)(原卷版).docx
- 高考生物一轮复习讲练测第22讲 生物的变异(第二课时,染色体变异)(练习)(原卷版).docx
- 高考生物一轮复习讲练测第22讲 生物的变异(第一课时,基因突变和基因重组)(讲义)(原卷版).docx
文档评论(0)