版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,编译原理,第七章 语义分析和中间代码产生,2,第七章 语义分析和中间代码产生,中间语言 赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 过程调用的处理,3,第七章 语义分析和中间代码产生,中间语言 赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 过程调用的处理,4,7.3 赋值语句的翻译,7.3.1 简单算术表达式及赋值语句 id:=E 对表达式E求值并置于变量T中值 id.place:=T,5,从赋值语句生成三地址代码的S-属性文法,非终结符号S有综合属性S.code,它代表赋值语句S的三地址代码 非终结符号E有如下两个属性 E.place表示存放E值的名字 E.code表示对E求值
2、的三地址语句序列 函数newtemp的功能是,每次调用它时,将返回一个不同的临时变量名字,如T1,T2,计算思维的典型方法-递归 问题的解决又依赖于类似问题的解决,只不过后者的复杂程度或规模较原来的问题更小 一旦将问题的复杂程度和规模化简到足够小时,问题的解法其实非常简单,6,为赋值语句生成三地址代码的S-属性文法定义,产生式 语义规则 Sid:=E S.code:=E.code | gen(id.place := E.place) EE1+E2 E.place:=newtemp; E.code:=E1.code | E2.code | gen(E.place := E1.place + E2
3、.place) EE1*E2 E.place:=newtemp; E.code:=E1.code | E2.code | gen(E.place := E1.place * E2.place) E-E1 E.place:=newtemp; E.code:=E1.code | gen(E.place := uminus E1.place) E (E1) E.place:=E1.place; E.code:=E1.code Eid E.place:=id.place; E.code= ,7,产生赋值语句三地址代码的翻译模式,过程emit将三地址代码送到输出文件中,T1 := y + z,a :=
4、T1,T2 := y - z,b := T2,8,产生赋值语句三地址代码的翻译模式,Sid:=E p:=lookup(); if pnil then emit(p := E.place) else error EE1+E2 E.place:=newtemp; emit(E.place := E1.place + E2.place) EE1*E2 E.place:=newtemp; emit(E.place := E 1.place * E 2.place),Sid:=E S.code:=E.code | gen(id.place := E.place) EE1+E2 E.plac
5、e:=newtemp; E.code:=E1.code | E2.code |gen(E.place := E1.place + E2.place) EE1*E2 E.place:=newtemp; E.code:=E1.code | E2.code | gen(E.place := E1.place * E2.place),9,产生赋值语句三地址代码的翻译模式,E-E1 E.place:=newtemp; emit(E.place:= uminus E 1.place) E(E1) E.place:=E1.place Eid p:=lookup(); if pnil then
6、E.place:=p else error ,E-E1 E.place:=newtemp; E.code:=E1.code | gen(E.place := uminus E1.place) E (E1) E.place:=E1.place; E.code:=E1.code Eid E.place:=id.place; E.code= ,a := uminus b,10,7.3.2 数组元素的引用,数组元素地址的计算 X := Ai1,i2,ik + Y Ai1,i2,ik := X + Y,11,数组元素地址计算,设A为n维数组,按行存放,每个元素宽度为w lowi 为第i维 的下界 upi
7、 为第i维 的上界 ni 为第i维 可取值的个数(ni = upi -lowi + 1) base为A的第一个元素相对地址 元素Ai1,i2,ik相对地址公式 (i1 n2+i2)n3+i3)nk+ik)w + base-(low1 n2+low2)n3+low3)nk+lowk)w C = (low1 n2+low2)n3+low3)nk+lowk)w,可变部分,不变部分,12,id出现的地方也允许下面产生式中的L出现 L id Elist | id ElistElist,E | E 为了便于处理,文法改写为 LElist | id ElistElist, E | id E,(i1 n2+i
8、2)n3+i3)nk+ik)w + base-(low1 n2+low2)n3+low3)nk+lowk)w,13,引入下列语义变量或语义过程 Elist.ndim: 下标个数计数器 Elist.place: 表示临时变量,用来临时存放已形成的Elist中的下标表达式计算出来的值 Elist.array: 记录数组名 limit(array,j) :函数过程,它给出数组array的第j维的长度,(i1 n2+i2)n3+i3)nk+ik)w + base-(low1 n2+low2)n3+low3)nk+lowk)w,14,每个代表变量的非终结符L有两项语义值 L.place 若L为简单变量i
9、, 指变量i的符号表入口 若L为下标变量,指存放不变部分的临时变量的整数码 L.offset 若L为简单变量,null, 若L为下标变量,指存放可变部分的临时变量的整数码,(i1 n2+i2)n3+i3)nk+ik)w + base-(low1 n2+low2)n3+low3)nk+lowk)w,15,(1) SL:=E (2) EE+E (3) E(E) (4) EL (5) LElist (6) Lid (7) Elist Elist, E (8) Elistid E,16,带数组元素引用的赋值语句翻译模式,(1) SL:=E if L.offset=null then /*L是简单变量*
10、/ emit(L.place := E.place) else emit( L.place L.offset := E.place) (2) EE1 +E2 E.place:=newtemp; emit(E.place := E 1.place + E 2.place),17,(3) E(E1) E.place:=E1.place (4) EL if L.offset=null then E.place:=L.place else begin E.place:=newtemp; emit(E.place := L.place L.offset ) end ,18,Ai1,i2,ik (i1 n
11、2+i2)n3+i3)nk+ik)w + base-(low1 n2+low2)n3+low3)nk+lowk)w,(8) Elistid E Elist.place:=E.place; Elist.ndim:=1; Elist.array:=id.place ,19,A i1,i2,ik ( (i1 n2+i2)n3+i3)nk+ik)w + base-(low1 n2+low2)n3+low3)nk+lowk)w,(7) Elist Elist1, E t:=newtemp; m:=Elist1.ndim+1; emit(t := Elist1.place * limit(Elist1.a
12、rray,m) ); emit(t := t + E.place); Elist.place:=t; Elist.ndim:=m Elist.array:= Elist1.array; ,20,Ai1,i2,ik (i1 n2+i2)n3+i3)nk+ik) w + base-(low1 n2+low2)n3+low3)nk+lowk)w,(5) LElist L.place:=newtemp; emit(L.place := Elist.array C); L.offset:=newtemp; emit(L.offset := w * Elist.place) (6) Lid L.place
13、:=id.place; L.offset:=null ,21,类型转换,用E.type表示非终结符E的类型属性 对应产生式EE1 op E2的语义动作中关于E.type的语义规则可定义为: if E1.type=integer and E2.type=integer E.type:=integer else E.type:=real 算符区分为整型算符int op和实型算符real op,,22,x := yi*j 其中x、y为实型;i、j为整型。这个赋值句产生的三地址代码为: T1 := i int* j T3 := inttoreal T1 T2 := y real+ T3 x := T2
14、,23,关于产生式EE1 E2 的语义动作, E.place:=newtemp; if E1.type=integer and E2.type=integer then begin emit (E.place := E 1.place int+ E 2.place); E.type:=integer end else if E1.type=real and E2.type=real then begin emit (E.place := E 1.place real+ E 2.place); E.type:=real end,24,else if E1.type=integer and E2.type=real then begin u:=newtemp; emit (u := inttoreal E 1.place); emit (E.place := u real+ E 2.palce); E.type:=real end else if E1.type=real and E2.type=integer then begi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山东省聊城市幼儿园教师招聘考试试题及答案解析
- 2026年张家口市桥西区幼儿园教师招聘笔试参考题库及答案解析
- 2026年防踩踏知识科普
- 2026年贵港市港南区街道办人员招聘考试参考试题及答案解析
- 2025年江苏省镇江市街道办人员招聘考试试题及答案解析
- 2025年山西省大同市幼儿园教师招聘考试试题及答案解析
- 2026九年级上《酬乐天扬州初逢席上见赠》教学课件
- 2026二年级下《克和千克》知识点梳理
- 2025年定西地区幼儿园教师招聘考试试题及答案解析
- 2026年齐齐哈尔市昂昂溪区幼儿园教师招聘笔试参考题库及答案解析
- 物流运输风险识别与控制
- 关于杭州市“社交主题酒吧”运营模式与典型案例的调研分析
- 阿里巴巴集团内部审计制度
- 纺粘针刺非织造布制作工操作知识考核试卷含答案
- 2025年国防军事动员教育知识竞赛题库及答案(共50题)
- 泛光照明施工安全措施方案
- KPS评分表模板及使用指南
- 2025年专利代理师资格真题及答案解析
- 2025年1月浙江省高考技术试卷真题(含答案)
- 两办关于进一步加强矿山安全生产意见
- 2025年湖南邵阳市中考物理考试真题及答案
评论
0/150
提交评论