第六章中间代码生成_第1页
第六章中间代码生成_第2页
第六章中间代码生成_第3页
第六章中间代码生成_第4页
第六章中间代码生成_第5页
已阅读5页,还剩162页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理

PrincipleofCompiler第六章中间代码生成黄孝喜在编译器的“分析-综合”模型中,前端对源程序进行分析并产生中间表示,而关于目标机器的细节则在后端处理。本章内容涉及中间代码表示、静态类型检查和中间代码生成。2引子语法分析器静态检查程序中间代码生成器代码生成器中间代码前端后端“中间代码生成”的任务把经过语法分析和语义分析而获得的源程序中间表示翻译为中间代码表示。不同的编译器对中间表示的选择和设计各有不同。中间表示可以是一种真正的语言,也可以是各个处理阶段共享的多个内部数据结构。早期的C++编译器就把C语言作为中间表示方法:语法制导翻译采用独立于机器的中间代码的好处1.便于编译系统建立和编译系统的移植;2.便于进行独立于机器的代码优化工作。3引子中间语言语法树有向非循环图DAG三地址代码表示类型检查常用语句的中间代码生成方法说明语句赋值语句布尔表达式与控制流语句回填4提纲常用的中间代码(语言)语法树后缀式(逆波兰式)三地址代码表示特点形式简单、语义明确、便于翻译独立于目标语言56.1中间语言抽象语法(AbstractSyntax)从具体语法中抽象出语言结构的本质性的东西,而不考虑语言的具体符号表示,从而可简化语义的形式描述。在不同的语言中赋值语句有不同的写法

x=y;

x:=y;

y→x等等可以用抽象形式

assignment(variable,expression)把前面各种具体形式统一起来。66.1.1图表示法抽象语法(AbstractSyntax)抽象语法树(AST)反映了抽象的语法结构,而分析树反映的是具体语法结构。语法树是分析树的抽象形式或压缩形式。在抽象语法树表示中,每一个叶结点都表示诸如常量或变量这样的运算对象,而其它内部结点则表示运算符。抽象语法树不同于分析树,它展示了一个操作过程并同时描述了源程序的层次结构。76.1.1图表示法语法规则中包含的某些符号可能起标点符号作用,也可能起解释作用。回顾前述的赋值语句,其产生式规则是S→V=e其中的赋值号“=”仅仅起标点符号作用,目的是把V和e分隔开而条件语句的产生式规则:S→ifBthenS1elseS2其中的关键字if、then、else起注释作用,说明当布尔表达式B为真时执行S1语句,否则执行S28抽象语法树赋值语句的本质部分是V和e条件语句的本质部分是B,S1和S2把语法规则中本质部分抽象出来而将非本质部分去掉后,便得到抽象语法规则这种去掉不必要信息的做法可以获得高效的源程序中间表示。上述语句的抽象语法规则为:(1)赋值语句:左部表达式(2)条件语句:表达式语句1语句29抽象语法树根据这种方法得到两种语句的语法树如下:10抽象语法树assignmentvariableexpressionif-then-elseBS1S2赋值语句语法树条件语句语法树在语法树中,运算符号和关键字都不在叶结点,而是在内部结点中出现。赋值语句x=a+b*c的抽象语法树和分析树11抽象语法树assignmentx+a*bc抽象语法树SV=ExE+EaE*Ebc分析树表达式的语法树构建方法(利用语法制导定义)辅助函数:

1.mknode(op,left,right)建立一个运算符号结点,标号是op,两个域left和right指向运算分量结点的指针。2.mkleaf(id,entry)建立一个标识符结点,由标号id标识,一个域entry指向标识符符号表中相应的项。3.mkleaf(num,val)建立一个数结点,标号为num,域val用于存放数的值。返回新建立结点的指针。12抽象语法树建立表达式语法树的语法制导定义13抽象语法树

产生式语义规则EE1+TE.nptr:=mknode('+',E1.nptr,T.nptr)EE1-TE.nptr:=mknode('-',E1.nptr,T.nptr)ETE.nptr:=T.nptrT(E)T.nptr:=E.nptrTidT.nptr:=mkleaf(id,id.entry)TnumT.nptr:=mkleaf(num,num.val)表达式a-4+c的语法树建立过程14idtoentryforaidtoentryforcnum4-+id1T1.nptrE2.nptrE1.nptrT2.nptr-T3.nptrid2E.nptrnum+表达式a-4+c的语法树建立过程15idtoentryforaidtoentryforcnum4-+建立烫赋值锋语句倒语法扇树的拐语法祖制导悼定义16抽象僚语法兼树

产生式语义规则Sid:=ES.nptr:=mknode(‘:=’,mkleaf(id,entry),E.nptr)EE1+E2E.nptr:=mknode(‘+’,E1.nptr,E2.nptr)EE1-E2

E.nptr:=mknode('-',E1.nptr,E2.nptr)E

-E1E.nptr:=mkunode(‘uminus’,E1.nptr)E(E1)E.nptr:=E1.nptrEidE.nptr:=mkleaf(id,id.entry)EnumE.nptr:=mkleaf(num,num.val)赋值奶语句a站:=绑b倡*-c的语略法树妥构建踩过程17id1S.n胖pt善rE1.n配pt辰r:=E2.n摩pt欢r*E3.n由pt宏rid2-E4.n舱pt蒸rid3idto端e确nt俩ry都f环or碑bidto政e魄nt冶ry朽f土or进cidto越e劣nt否ry凳f丽or以aum乒in所us*:=赋值直语句a已:=月b明*-c的语肿法树鉴构建电过程18idto牲e胳nt冲ry言f害or酿bidto集e罩nt售ry架f腔or慎cidto健e全nt但ry颈f摄or田aum悔in遣us*:=表达毫式的蜡有向伍非循次环图锐表示(D愈AG,Di堆re复ct末ed简A减cy增cl皮ic挡G萌ra黑ph笋s)用途:提取盈表达悠式中义的公多共子站表达枯式,另以取谈得目办标程负序的够局部杂优化但。方法柏:执挨行mk烂no唉de和mk驼le纳af时,恋检查予是否犹已有殊相同溪的结旗点,址若有庙,则就返回菜相应亏结点齿的指灯针。与语业法树辫的区哄别:康语法鸟树中欢公共柱子表膀达式西由重诞复的屋子树员表示资,而DA僚G中只终用一呼个子退树表廊示,件因此倡代表机公共通子表纤达式腿的结鸟点有倦多个束父节点196.废1.渠1图表养示法表达黄式a+动a*映(b弱-c奴)+腊(b猪-c振)*研d的语恩法树拌和DA坛G206.贝1.爸1图表示培法idto讲e派nt鱼ry师f膝or蛮aidto扎e王nt诸ry膛f储or把a+idto腔e泥nt镇ry拳f余or摧bidto侧e挣nt科ry衰f斗or征c-*idid-to耍e炒nt逐ry唤f述or脏bto宰e念nt云ry坦f递or赢c*idto习e振nt沙ry探f凉or镜d+表达阔式a+智a*染(b坦-c镇)+妄(b仍-c铃)*巴d的语催法树颗和DA登G216.津1.康1图表示鞠法p1次:=娘mk膏le踪蝶af刊(i诉d,宵e峡nt秩ry冤-a刃);p2状:=艰mk灶le馋af所(i逮d,迷e固nt以ry牢-a碰);p3借:=喜mk凤le分af钟(i粘d,刑e贫nt计ry茂-b窜);p4夸:=河mk拼le数af榨(i朴d,座e缠nt哥ry亿-c呀);P5苗:=敞mk曲no择de霜('-孟',p3醉,负p4扇);P6量:=努mk台no括de描(‘*虏',p2司,慨p5薄);P7树:=犁mk普no变de澡(‘+昂',p1路,阳p6系);P8胜:=娘mk篇le讽af踪蝶(id裳,坛en推tr胀y-振b);P9摆:=苏mk行le睡af雷(id浸,发en私tr狼y-锄c);P1萄0:父=m鹅kn亮od乒e('-坊',p8钻,切p9谎);p1乘1:炮=m秤kl阿ea望f(趴id乘,巴en邮tr划y-竞d)魂;P1胁2:歌=m县kn吊od乳e(‘*艘',p1这0,降p钱11雕);P1坑3:闸=m眼kn输od寄e(‘+党',p7傅,恨p1沫2)修改胶建立蠢表达版式语佳法树纺的语添法制侵导定稍义,册产生购表达表式的DA卵G在构胳造结勾点前晴检查号现有岸结点廉,若规存在脸相同纯结点躺则返去回该桂结点皆的指结针表达喝式a+谷a*持(b伐-c咸)+雹(b孝-c客)*雪d的语失法树无和DA担G226.丛1.始1图表示掩法idto蔽e嘉nt继ry魂f图or微a+idto疤e如nt的ry居f辈or垫bidto昆e洁nt讨ry丈f闹or捧c-**idto千e别nt们ry哀f漫or瓜d+12345678910111213波兰双逻辑观学家卢卡朴西维玩奇(L浓uk缠as藏ie宰wi妻cz学)发明杜的一蚊种表榜示法蚁。这种眠表示钩法把真运算欠量(操作安数)写在染前面考,把哨运算辰符写旨在后或面,险因而释又称民后缀锈表示劣法。捞例如佩,把a+绪b写成ab命+,把a*待(b候+c粘)写成ab汗c+龄*。一般段,若e1,e2为任奸意的恢后缀舌表达抱式,Θ为任瓜意双葛目运抱算符矿,则黑用Θ作用瓦于e1和e2所代阳表的瓦结果划用后涝缀式e1e2Θ表示肠。推而犯广之缝,Θ为k目运算优符,则Θ作用舅于e1e2…ek的结价果用e1e2…ekΘ来表膏示。236.害1.锣2逆波耀兰式银表示融法中缀奇式:秋a*乔d蹲+液b*生c般+e24由抽堡象语熔法树蚀生成脾后缀控式+*+ad*ebc抽象怀语法预树后根拾遍历抚生成乔后缀润式:a而d史*倒b男c客*他+演e剪+25由语忽法制着导定煌义生龙成后业缀式产生式语义规则S→id:=EPrint(||E.code||“:=”)E→E1+E2E.code:=E1.code||E2.code||“+”E→E1*E2E.code:=E1.code||E2.code||“*”E→-E1E.code:=E1.code||“-”E→(E1)E.code:=E1.codeE→idE.code:=E→numE.code:=num.val;属性co僻de表示遥生成蒙的代麻码后缀圣表示齐法的优点:易正于计愧算机违处理拜表达朴式。常用资的算扛法:行使用口一个鼻栈,停自左伪至右烛扫描拖算术窄表达目式(后缀姥表示):扫描扶到运铅算对援象,尸就把粗它推掘进栈线;扫描泄到运露算符:若该赠运算稀符是鹅二目切的,撤则对头栈顶豪部的蝴两个始运算页对象伸实施息该运垄算,镇并将莫运算习结果渣代替她这两办个运鬼算对巾象而拿进栈冲;若是攀一目带运算熊符,卷则对到栈顶座元素骂执行锹该运遵算,缘瑞并以茂运算嘴结果咬代替绑该元滋素进帽栈。最后某的结史果留尽在栈裤顶26后缀尝式的膨求值ab扒+c堡*的求肉值(a竖=1兄,b锁=3村,c魄=5)27后缀冤式的压求值1甲3关+赠5*13+41+伪3=贷45*4*涉5=谋2020计算驾完毕俯,结老果为20一般滋形式x:=y杨op坡z一般套含三潜个地玩址(名字观、常动数、临临时荣变量):两个艰操作顽分量博和一旷个结堆果的剑抽象盈地址为方复便起贤见,通常踩用变春量名僵代替粮抽象廊地址如,源语茶言表达目式x+段y*抱z可以念被翻受译为:t1:=边y栋*秘zt2:=浴x屋+t1其中t1和t2是编葱译时坝产生膜的临腿时变蹄量286.增1.粪3三地听址代赔码三地向址代担码与游语法树、DA驼G的关摄系三地防址代受码是麻语法盐树或DA卖G的线摘性表臣示表达宴式a+求a*就(b慈-c幸)+康(b茄-c荡)*化d的语爬法树汉和DA匙G对应小的三诊地址代码296.眯1.罚3三地售址代饰码t1:=各b寺–僚ct2:=欣a尸*阁t1t3:=淋a雀+税t2t4:=睁b霜–诵ct5:=敬t4*穷dt6:=羞t3+拳t5根据薯语法往树t1:=培b杯–匆ct2:=续a悦*昼t1t3:=桑a仍+悔t2t4:=耀t2*歇dt5:=台t3+丛t4根据DA晴G三地矛址代溉码的甘类型(1北)赋值马语句x:=y币op蓬z,op为二座目算性术算凑符或宜逻辑股算符(2案)赋值醒语句x:=op恶y,op为一推目算查符,篮如一毙目减um脚in洽us、逻核辑非no怪t、移糊位算棕符及厉转换境算符(3予)无条偿件转龙移语肢句go袄to肢L(4艺)条件己转移喊语句if拣x激r您el球op央y店g汇ot屠o峡L,关旺系运安算符预号re干lo槐p(狠<,=,>=等等)(5昌)复制礼语句x:=y306.晴1.厅3三地介址代按码三地厉址代贷码的旨类型(6兼)过程烫调用转语句pa集ra劳m溉x和ca锣ll死p疤,恶n。过贿程调括用语笔句p(给x1葛,瞒x2计,…故,他xn蜡)产生满如下予三地皮址代架码:pa住ra伞m堪x1pa肉ra土m盯x2…pa脑ra浅m臂xnca炕ll淡p副,女n过程尺返回捉语句re牧tu芹rn碰y316.糟1.灭3三地拉址代舍码三地倚址代条码的弯类型(7农)索引誉赋值衣语句坐:x:乐=y旬[i秋]x[匪i]壶:=励y(8惜)地址殃和指右针赋锣值语苍句x:兵=&老yx:拒=*散y*x炮:=暗y在设郊计中父间代箩码形砍式时轿,选圣择多壁少种益算符翁需要菌平衡326.考1.嚼3三地经址代半码例子:衔do逮i歌:=病i+僚1;悦w问hi岸le荡(盒a[勇i]境<阔v纽奉);的三掌地址翻译336.寸1.桌3三地贝址代届码L:荡t1=霸i肝+1i档=t1t2=猛i阅*盒8t3=掏a[文t2]if神(祖t3<惹v)今g逐ot傻o贷L10艳0:统t1=碧i手+110盾1:劫i狂=刊t110别2:捉t2=菌i片*赛810骆3:坊t3=妨a[旨t2]10浓4:凤i混f泽(t3<坡v)裙g沫ot悟o旬10饺0用标榴签形泊式用标笨号形远式假设材数组a中每扔个元钻素占距用存治储单泻元为8语法守制导酷翻译帅生成金三地解址代简码定义净几个属迁性:(1值)E盘.p制la炎ce表示粮存放E值的位名字拆。(2筒)E供.c互od哨e表示采对E求值黎的三释地址耐语句佣序列浸。(3闷)之ne宜wt日em彼p是个豪函数俱,对留它的独调用迎将产生陷一个新做的临乡丰时变补量。346.祥1.奏3三地互址代银码35语法担制导浴翻译送生成邮三地被址代苏码

产生式语义规则Sid:=ES.code:=E.code||gen(id.place':='E.place)EE1+E2E.place:=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)E

-E1E.place:=newtemp;E.code:=E1.code||gen(E.place':=''uminus'E1.place)E(E1)E.place:=E1.place;E.code:=E1.codeEidE.place:=id.place;E.code:=''三地票址语借句序肆列是保语法断树的写线性议表示贱,用泄临时压变量合代替届语法饼树中秆的结盖点。实际艘实现墓中,谊三地换址语退句序视列往绩往是住被存务放到僵一个枣输出越文件静中,阁而不蜘是将冬三地抛址语专句序出列置艺入co墙de属性之中36语法碰制导掠翻译系生成伯三地朱址代剑码三地陪址代境码的存具体百实现1.四元售式op春,良ar梢g1废,鸽ar寻g2搜,劣re朴su峰lt2.三元信式op咏,卡ar谎g1扯,轻ar画g23.间接龙三元它式间接零码表+三元投式表376.长1.银3三地搏址代录码三地县址代扶码的很具体团实现四元式航有四羊个字闪段,吸分别克称为op解,饲ar聚g1伐,恋ar贯g2尤,亲re辩su拌lt。字铲段op包含宿一个抹运算永符的监内部宾编码托,如艇对于扁三地肆址指斑令x=斩y+改z的相收应四锁元式辱中,op字段勺存放+,ar战g1中为y,ar折g2中为z,re屈su天lt中为x。对于电形如x=沉op袍y的单须目运茫算符裳指令勇和赋靠值指行令x=料y,不硬使用ar参g2。像pa认ra腰m这样隆的运甚算既乖不使邮用ar款g2也不闲使用re杯su气lt。条贝件或狡非条脑件转扣移指话令将约目标拔标号肠放入re广su架lt字段386.宇1.蛙3三地婆址代颂码对于语句a:次=b容*-卷c+距b*汽-c的三软种表络示方扒法39三地马址代愁码的骆具体实现t1=着um士in凉us茂ct2=便b吃*芒t1t3=威um泉in削us龙ct4=灿b呈*扛t3t5=辫t2+芒t4a戴=崖t5三地跳址代昏码oparg1arg2result0uminusct11*bt1t22uminusct33*bt3t44+t2t4t55=t5a四元处式对于语句a:拿=b蛮*-仙c+激b*虑-c的三姥种表葵示方闻法40三地辽址代越码的判具体实现oparg1arg2result0uminusct11*bt1t22uminusct33*bt3t44+t2t4t55=t5a四元仔式oparg1arg20uminusc1*b(0)2uminusc3*b(2)4+(1)(3)5assigna(4)三元喊式三元果式中说使用指向止三元汗式语要句的骨指针。对于语句a:纺=b伙*-堵c+掀b*危-c的三均种表明示方积法41三地半址代炉码的誉具体实现oparg1arg20uminusc1*b(0)2uminusc3*b(2)4+(1)(3)5assigna(4)间接伤三元峰式表释示statement……1001(0)1002(1)1003(2)1004(3)1005(4)1006(5)……三地合址代封码三依种实怪现形轧式的膨比较代码味优化画时,帅经常顺因调荷整计镇算次树序而概要移砖动三两地址负语句四元式即调整模顺序重方便习,但否引入少的临攻时变淹量多狱,需味存储功空间守大三元膝式需斧存储亡空间少最小辈,但鸣调整舍顺序帽不便间接忠三元梯式优吩化方骨便,祥在有举公共重子表鼠达式哥时,摆需存父储空油间比摸四元丙式小中间摇代码钱优化授处理绵时,说四元场式比奥三元筹式方暮便的含多,间接劫三元躲式与候四元幅式同耀样方耐便,已两种万实现常方式缠需要凶的存观储空秘间大债体相总同。426.某1.闻3三地即址代迈码例:a+干b连*哗(席c离-致d亚)咳+蓝e轨/序(辅c报-次d)别↑停n求:1.后缀扒式2.四元愉式3.三元勤式4.间接可三元式43中间丑语言聪练习例:a+毛b备*诞(孕c渠-桌d滨)溪+狐e趋/剧(丛c利-凡d)天↑n后缀渐式a眨b牺c甲d但-让*忠+胁e玩c台d鼠–袖n↑叹/受+三地鲜址代戴码t1=捧c段–枕dt2=雹b雕*亭t1t3=票a户+盛t2t4=扮c忘–拍dt5=拍t4↑围nt6=攀e数/缸t5t7=挠t3+谅t644中间推语言毛练习例:a+旁b局*扣(高c泪-豪d谣)黑+狂e屈/刊(曲c皱-与d)剖↑n四元歪式45中间沸语言苦练习oparg1arg2result0-cdt11*bt1t22+at2t33-cdt44

↑t4nt55/et5a6+t3t6t7t1=摊c伏–组dt2=座b逮*值t1t3=放a吴+黑t2t4=好c灾–汽dt5=现t4↑贴nt6=押e稠/亿t5t7=间t3+缠t6例:a+钩b扔*腥(巷c蕉-仇d奶)停+港e饿/克(定c灭-猾d)替↑n三元田式46中间湿语言严练习oparg1arg2result0-cdt11*bt1t22+at2t33-cdt44

↑t4nt55/et5a6+t3t6t7oparg1arg20-cd1*b(0)2+a(1)3-cd4

↑(3)n5/e(4)6+(2)(5)例:a+演b栏*翻(聚c寇-者d捆)纷+泡e品/童(填c膨-租d)做↑n间接三元途式47中间宅语言艘练习oparg1arg20-cd1*b(0)2+a(1)3

↑(0)n4/e(3)5+(2)(4)statement……1001(0)1002(1)1003(2)1004(0)1005(3)1006(4)1007(5)……中间缺语言语法脾树有向奥非循顿环图DA骂G三地护址代环码表反示类型巴检查常用肾语句盈的中抗间代童码生闸成方渡法说明闸语句赋值堪语句布尔孕表达竿式与侵控制辜流语除句回填48提纲每个境程序仓设计袖语言央都有团自己屯的类据型机典制,腥包括把类型犹说明网和使扔用。类型绩检查是编副译器刚语义葱分析怕的重劈燕要组贡成部史分菊。编稻译器赤首先解根据宏类型蕉说明陡,确果定每从一个签变量唤和常锅量的笔类型是,顿计算炮其使主用存蛛储空李间的翻大小狡,从暑而建晕立其表到存队储空杰间的融映射诸。进窃而,富编译椒器要盐确定千每个糠语言迅结构板的类蚂型,床以完以成下矮面的犹主要泪任务:(1西)判定信重载点算符(函数)在程明序中报代表状的是茧哪一疗个运悠算(2尖)进行虾类型两转换(3族)对语宣言结大构进滔行类太型检卵查。喂如:老Pa糠sc直al语言饶中对布数据婆类型扇的使惊用要拆进行垒同一映、相枝容和磁赋值腰相容伍检查496.馆2类型较检查类型姥表达类式语言眼结构熔的类洒型由献类型钻表达破式表绑示。阔类型教表达欣式依帮赖于锐程序烫语言眉的类释型体调制。类型决表达沫式:或者犹是简堤单类缘瑞型表嫁达式孙,或不者是扔通过创类型垃构造弦符作你用于厕类型进表达扭式而共得到士,具驰体定斯义如会下:(1游)类型鉴名和忍基本治类型这是类等型表遣达式。in桌te牵ge缎r,厘c钳ha诸r,犯r梅ea攀l,于b皮oo挤le夕an是(P线as虏ca狂l语言)基本剑类型逗,所泄以是性类型垄表达扇式。vo姻id表示滥“无吼类型留”,ty绵pe赖_e钩rr渣or表示弓“出阻错类到型”阿,也狂是类绕型表头达式。506.本2类型伍检查可以就把这嚷一条煌看作苍是类硬型表乌达式捞定义浩的核败,然职后通哗过下桂面的蜜类型沫构造吨符来俗生成抵更复总杂的毒类型婆表达僵式(2棍)类型耽构造慰符作崖用于恨类型轨表达筑式的耍结果鱼仍然忙是类价型表油达式辱。类蚊型构传造符旧包括:a)数组铜构造敬符AR无RA比Y。如读果T是一莫个类坦型表翁达式军,则AR颜RA庆Y(欠I,颠T予)是类螺型表快达式消,指唐称一真个数岛组类括型,T为其猛成分急类型踢,I是下美标值面集合b)笛卡缠尔乘节积×:若T1,T2是类楚型表醋达式班,则T1×T2也是连类型叼表达逝式,塔其中×是左河结合袜的。c)记录衣类型酿构造芽符RE狂CO扇RD脊:若有挨标识友符N1,N2,…,Nn和类航型表贺达式T1,T2,…,Tn,则RE翁CO卸RD许((帜N1×T1)×否(N2×T2)×互…×娱(Nn×Tn))是类的型表更达式厚,指滩称了应一个测记录洽类型捏。51类型授表达绳式(2牧)类型照构造鞠符作困用于森类型脑表达脸式的碧结果担仍然男是类健型表伏达式君。类牙型构屋造符值包括:d)指针络类型逗构造蚁符PO劣IN脖TE垮R:若T是一敬个类壤型表植达式挺,则PO笼IN厕TE梅R(结T)是类臂型表救达式岔,指胖称一鞠个指撕针类陵型。e)函数扭类型铸构造摧符→:若D1,界D2,士…,陪Dn和R是类种型表馋达式喷,则D1×D2×…险×Dn→R是类劝型表铸达式伙,其班中×的优辜先级做高于歪→,染它指祝称了献一个奋从定颤义域往类型赞为D1×D2×…融×Dn到值悄域类阅型为R的映多射(函数)(3些)类型迎表达贷式中皆可以记出现寻类型唱变量害,其寸值也蛮是类弱型表迷达式52类型葵表达此式例153类型向表达艘式设有Pa本sc典al程序捐片段棋:TY汗PE桥s勒ty搅pe锡=R勾EC盲OR及D蹄na弓me电:A这RR猜AY误[虫1.绞.8烤]漆OF根c百ha霸r;讽s钻co讲re亡:i言nt享eg危er竟EN息D;各V抵AR扔t缓ab舱le型:A熄RR初AY趴[薯1.娃.5柜0]炭O经F腿st屑yp裤e;医p衡:欣↑s蒙ty遣pe戚;则st灰yp只e代表帐的类恩型表捡达式RE蜂CO举RD博((兵na顷meAR著RA御Y(葵1.训.8帖,唱ch抖ar化))(s互co洲rein毒te寻ge捆r)瞧)和ta岂bl殿e绑定伴的类揪型表缺达式AR苗RA喜Y(秤1.释.5伏0,颈st挠yp我e)和p绑定骗的类缎型表勺达式PO汁IN章TE粪R(许st冒yp凭e)例2设有而下面菠的函宁数定劫义FU栗NC位TI背ON划f需(P1:T1;各P2:T2;柴…;坛Pn:Tn):缎T;棉BE国GI吓N控…响EN嘉D;和f绑定铅的类设型表纹达式T1T2…Tn→T如定描义函瞎数FU疯NC趴TI某ON丽f赢(a莫,蜓b:剑c织ha酷r)讲:↑in撇te隙ge雅r;BE午GI得N矮…霉EN择D;F绑定债的类轮型表胀达式掩为ch喷ar良×c嗽ha壳r→PO漏IN拾TE福R(留in职te松ge欢r)54类型孝表达千式例3在函见数式咽语言薄中可街如下六定义泪恒等浩函数fu购n饶f(吩x)穷=x催x可以移是任步何类吨型的汤语言赤结构句。因蚀此x可以舅是任晒何类汽型。f的类骗型表亩达式错为狼为类型塞变量,其园值是屡任何缓类型悠表达脆式。55类型底表达墓式静态撒类型承检查:由编园译器陪完成故的检淘查动态牢类型用检查:目标沙程序事运行摘时完延成的谷检查如果雀目标辨代码鼠把每工个对恳象的寺类型喜和该汤对象催的值葡一起秒保存捞,那子么任睛何检艘查都平可以具动态话完成啊。如果径一种握语言组的编烫译器吓能够锣保证赤它所即接受嘉的程住序不玩会有渔运行韵时的泊类型锈错误农,则云称这谣种语美言是强类达型语雄言。有些恋检查析只能率动态霉完成ta轨bl忘e:骡a蝴rr陵ay搂[0组..摔25煤5]绸o横f搬ch叠ar交;i:羡i黎nt纱eg历er偏;计算ta姜bl挡e[鼓i]类型迫检查绳的内寺容包且括:表达康式、语句、函数566.著2类型赛检查变量圈标识抬符类牧型的豪确定程序稿是由下说明定序列马和语朱句序娇列组粱成语句鄙序列啄是计除算,坐说明旱部分焰建立鲜计算呆环境而,其互中说跃明了枯每个萌变量触标识附符以骄及与援之绑砍定的举类型文法G[抓P]是一罩个简糠单的姑程序司语言闷语法俘,该脸程序销由一匆系列虎声明D和随跌后的皂表达竞式E组成袖,假冻设数否组的母下标刻从1开始拔,产军生式习如下:P→抹D;亿E演D→铃D;膀D啦|i停d:乳TT→群ch魂ar室|开i终nt喷eg把er昼|概A挂RR坏AY论[n称um性]纱OF呜T泥|虾↑勿T么E洒→n太um级|型i仇d倚|粥E历MO怠D裳E救|跟E[哥E]燥|泥E乓↑576.珠2类型教检查语义抹分析肾程序海首先欣处理佩类型木说明版,建争立类邪型表第达式寸,然校后处曾理变勤量说危明,隆建立梯变量宵和类碰型表饲达式越的绑调定。勿具体哄实现旅是把贺变量贡标识启符的刘类型址信息摊记录谅在其宴符号项表的黑表项完中,浓过程ad停dt丛yp殃e(落id默.e铅nt绣ry苗,T涉.t侦yp优e)完成趴这个音任务唇,引职入综握合属奶性T.廉ty廉pe,记迅录类悼型表衔达式五。其博翻译岁模式爆如下:586.袭2类型扶检查P→捧D;舞E氧D垫→D往;D绑D→壤id邀:T潮{怖ad错dt旋yp良e(酬id瓣.e膨nt铅ry踩,留T.生ty圈pe抱)}挪T→斩ch储ar渡{蠢T.迹ty唯pe忧:=第ch垂ar巨}谜T佛→i贞nt册eg若er恨{T算.t证yp得e:罢=i章nt吐eg嚷er培}披T走→↑固T1{T症.t超yp丑e:喘=P备OI毁NT多ER摘(T1.t撑yp骡e)暗}绳T门→A裕RR佩AY槐[n肚um腾]联OF溪T1{T漫.t劳yp气e:洒=A厅RR询AY历(n昂um陕.v改al肚,弱T1.t室yp治e)很}表达箩式的理类型玻检查检查狭运算赠对象仆之间晕类型拢是否锹满足钞相容未条件探。引低入综惑合属俘性E.添ty张pe来表粮示E的类絮型表四达式喷。596.壶2类型驾检查E→具nu戏m{E.蹄ty远pe:=in慰te衡ge风r}耗E享→i唯d诉{E.雅ty朝pe:=论lo韵ok摇up谋(i纲d.苍en群tr烦y)笔}函数lo托ok睁up栗(e私)取符件号表慌中保丑存在院条目e中的明类型裹。表达叶式的宋类型肿检查检查梨运算暑对象阻之间喝类型钱是否疤满足斥相容秋条件极。引笨入综沟合属唱性E.民ty寇pe来表朱示E的类示型表段达式竿。606.织2类型叛检查E→迎nu动m浊{E轧.t元yp峰e:序=i琴nt记eg切er习}孕E末→i风d捕{信E.斩ty淡pe耕:=摇lo骡ok削up装(i虏d.须en劫tr赴y)}E→踩E1MO舒D翻E2{E.件ty载pe:=湾IF(E1.t厕yp蝴e=灭in画te跃ge论r)厘AN裤D奶(E2.t痛yp殖e=妄in遗te稍ge拔r)TH凑ENin丑te毯ge仇rEL肾SEty丝式pe快_e辛rr悟or}一致里性检或查,约假设MO育D的运旨算分头量必蔽须是in篇te原ge楚r,结典果也伍是in先te盒ge辅r表达婶式的洁类型站检查检查随运算符对象场之间弊类型耐是否型满足铁相容全条件您。引来入综遥合属倾性E.旷ty足pe来表可示E的类工型表刊达式迹。616.蓬2类型预检查E→瓦nu挎m衬{E划.t各yp抽e:借=i堪nt名eg挣er挑}迹E愚→i肌d湿{禾E.块ty暴pe符:=降lo迷ok柄up烦(i宽d.慎en包tr该y)}E→扰E1MO会D信E2{E萍.t浑yp贴e:跌=I朴F(E1.t凉yp锋e=产in秃te皂ge宏r)吉A庆ND狗(烫E2.t炕yp轧e=洁in奶te钞ge佩r)TH走EN稍i固nt涂eg脖er煌E吨LS查E险ty傅pe外_e蛙rr姿or盘}E→津E1[E2]惰{E.修ty救pe:=亮IF(E2.t萄yp数e=铜in塘te柄ge斩r)宁AN使D宝(E1.t应yp引e=它AR悔RA堡Y(挽s,哭t刘))TH伸ENtEL著SEty掩pe俊_e久rr桂or}E→弱E1↑抽{E.滥ty洲pe:=挽IFE1.t代yp本e=炊PO唤IN磁TE窄R(粥t)TH毁ENtEL音SEty流pe臂_e绩rr巩or}语句最的类蓝型检弊查语句警的类绝型检判查主捐要包至括:寒赋值自语句膛类型哲的相弦容性席,控环制表脂达式小的结骗果类则型检叙查。指派瘦给语逢句的触类型转是基维本类咏型vo另id,如绒果在杜语句前中发劲现类睬型错即误,陡指息派给氧语句棉的类熊型是ty攻pe扭_e荡rr局or。由于掏语句杜中嵌春入了阳表达犬式,耕所以轿在语形句的蜂类型劲检查卖中总贫是需析要对券表达休式进罚行类买型检绸查626.字2类型厉检查检查槐语句瘦类型倒的翻涌译模式636.门2类型控检查S→歇id镰:=刺E港{S腊.t竭yp鄙e:啊=I纺Fid窗.t催yp砖e=乓E.安ty猫peTH捧ENvo镰idEL秋SEty推pe睡_e抢rr饺or}S→罪IF五E血T聚HE首N愧S1{S桥.t拼yp革e:代=I晴FE.提ty垄pe征=b艰oo恰le沾anTH狭ENS1.t苍yp许eEL登SEty吩pe光_e民rr粮or}S→寒WH乔IL访E获E崇DO绍S1{S闷.t担yp缩慧e:补=I役FE.谁ty组pe预=b教oo赵le让anTH也ENS1.t洗yp烛eEL铁SEty地pe运_e桶rr还or}S→翻S1没;S冰2忠{S咱.t鸟yp嫌e:姜=I唇F(S1.t透yp天e=铃vo嚼id斑)A脚ND晒(S2.t寻yp漆e=骨vo馅id胞)TH浮ENvo得idEL踩SEty径pe谨_e策rr粒or}函数侮引用句的类贯型检贯查函数岸引用旷的两田种情叙况:标准袋函数,或瓶者在说束明部床分定答义的函数对说炒明部陪分的瓶分析每,应叹该能新知道泳被引甩用函拾数的询类型华,翻茄译模六式为T→骄T1’→’T2{T黎.t科yp学e:避=T1.t杀yp鹿e→泳T2.t唱yp盆e}函数丧引用章可以喊看作京是一遥个表烦达式刘作用福于另黎一个肤表达誉式,忠其类乐型检造查可浇表示赴为:E→情E1(E2)盲{E泡.t婶yp升e:筹=I恋F步(E2.t厕yp罩e=感s)舅A童ND啊(已E1.t纲yp拆e=壮s→蓝t)岭T搂HE于N蓄tEL旷SEty棋pe视_e耽rr胜or驾}646.供2类型齿检查函数愿引用爆的类识型检瓦查函数拣引用定的两层种情葵况:标准轿函数,或夹者在说载明部隔分定译义的函数对说杨明部耳分的令分析棋,应壶该能翁知道列被引掌用函株数的糟类型发,翻贸译模裂式为T→垫T1’→’T2{T帅.t仙yp怪e:害=T1.t币yp奥e→混T2.t贿yp槐e}函数疫引用燥可以莫看作反是一助个表疏达式健作用索于另乘一个里表达仔式,肃其类邮型检滤查可闹表示互为:E→瓣E1(E2)款{E渠.t闹yp谜e:膛=I退F疾(E2.t秀yp欢e=由s)读A坡ND召(煎E1.t周yp伞e=魄s→乞t)涌T咐HE崇N饶tEL乎SEty你pe摘_e状rr乓or米}656.麦2类型除检查把单砌个参浅数推挎广到袖多个宅参数,类型遥为T1、T2、…、Tn的n个变偏元可池以看睛成类怖型为T1T2…Tn的一漫个变士元。类型晶转换一般当的程玩序设刷计语馒言中滨都规蚁定了坡某些脚类型怖之间婆的转授换关巾系:爆比如洲说整僻数量宣可以辛被当遵作实娇数量宽参与夏运算燃,并速且不址需要泡程序脸员显声式说宫明。不同棍类型门的常牺数在伐计算喘机中估有不唉同的液表示述。当稼一个双值需咏要转勉换成倒为其乐它类尖型使傅用的立时候立,需富要使育用某桂些代剧码进指行转坛换。因此买,编枣译程舟序要撞识别梨需要助进行笔类型寺转换玻的地套方,垂并相箩应地敏生成帜代码租。程序尖设计示语言案的设较计者锄需要袍考虑踩什么州情况钥下需貌要和他可以顽进行寄转换。666.宏2类型今检查表达乓式:x+砍i,x为re撞al,i为in凉te颈ge浅r整型驾数和梅实型宗数在禽计算护机中竿的表闭示不趋同,天运算骄的机详器指队令也吃不同编译妹程序假必须糕首先愿转换为一个粪操作屈数,硬以保煮证类钱型相袖同语言渗定义名指出粗什么统转换磨是必衫需的赋值傲语句:把赋例值号扯右边熄的对洋象转伏换成陷左边透对象比的类爪型表达训式:把整飘数转没换成率实数捕,然究后在包这一略对实停型对再象上悉进行务实数灾运算类型哨检查欢器在凉源程猾序的闸中间毕表示怀里插喘入这鸭些转遣换操宏作x+柏i的后首缀式阁可能柳是:x民i弊in垮tt革or染ea虫l馒re语al+67类型转换如果派从一丸种数农据类修型转吓换成唇另一宫种数悼据类多型可定以由泉编译减器自小动完者成,术则这耳种类僻型转异换是释隐式羡的,借隐式脾转换处也叫序做强制恐转换是。一般滚要求幅隐式净转换参原则用上不摊丢失徒信息如果医转换陕必须姐由程趟序员汁显式资地写书在源预程序螺中,早则这萄种转厅换叫嘴做显式趋转换。显式雷的类童型转次换对召类型菌检查码器来问说好搏象函绢数调经用68类型转换69从整丹型到穿实型垫的类嘴型检腰查规爹则产生式语义规则

EnumE.type:=integerEnum.numE.type:=realEidE.type:=lookup(id.entry)EE1opE2E.type:=IF(E1.type=integer)AND(E2.type=integer)

THENintegerELSE

IF(E1.type=integer)AND(E2.type=real)

THENrealELSE

IF(E1.type=real)AND(E2.type=integer)

THENreal

ELSE

IF(E1.type=real)AND(E2.type=real)

THENrealELSEtype_error}

说明(声明)语句的翻营译作用:说明敞语句(D备ec茧la岭ra千ti椒on越s)用于湾对程缎序中负规定穴范围贯内使串用的滔各类绳变量者、常孔数、源过程多进行翅说明编译块要做摄的工工作在符悦号表固中建州立相岂应的凑表项举,填忌写有新关的炭信息炸。如布类型纪、嵌新套深雁度、先相对桑地址拆等。相对参地址:相对酬静态筋数据士区基续址或活榜动记峰录中疾局部倒数据担区基貌址的一埋个偏拍移值。706.撞3常用么语句痒的翻夕译过程中中的吉说明卷语句一个删过程修中的暑说明颗语句曾作为卖一个叹类集教来处谣理。帅用一停个全流程变吐量of急fs牧et来记撞录下奏一个盈数据我在符逢号表沿中的侄相对腰地址。71说明(声明)语句孟的翻译类型碌说明枕和数料组说腥明的懒文法税和翻高译方究案P→报DD→飘D;亦DD→毙id:TT→兆in畜te乖ge锣rT→之re岗alT→犹ar春ra斯y[阴nu飘m]勒of行TT→春↑挤T引入:全局君变量of苏fs傅et,记承录下然一个纲可用销单元守的相剩对地夏址T.乳wi祸dt刃h:记姿录名尼字的牲域宽T.者ty血pe:记冰录名华字的嗓类型en映te菜r(攻id溜.n护am泼e,T.虽ty直pe,of撞fs裁et角):为名鞋字na卫me建立巡寿一个展符号必表表诸项72说明(声明)语句稀的翻开译PDDD;础DDid枕:TTin爹te匹ge讲rTre诞alTar膀ra续y子[n勇um域]哥of粉T1TT1{贱of赖fs爸et追:=砖0;}{是en污te嫩r(点id徒.n乘am歇e,池T.腿ty斧pe汁,列o婆ff侄se慢t)疲;of辉fs盐et掉:=饰of怖fs也et辽+T暴.w报id炊th晴}{趁T.馋ty嚷pe后:=雨in朗te堵ge兰r;渡T.闪wi崭dt狸h:鹅=4美}{吃T.厕ty权pe芬:=还re故al鄙;日T.鹊wi搬dt抱h:撇=8扩}{枣T.遗ty蹈pe请:=妄ar伏ra仇y(拆nu政m.壁va谊l,纤T1.t激yp辽e)达;T.唉wi棒dt带h:跟=n脑um闹.v来alT1.w痕id银th辆}{党T.够ty裙pe价:=岗po和in帖te粉r(套T1.t裕yp肾e)屯;克T茄.w杂id酱th慨:=觉4营}PMDM{沃of须fs肿et列:=革0梦}M称为沃标记垮非终蹈结符73处理焦说明吗语句id乖1:垃r连ea宇l;槐i均d2趟:帆↑i妄nt涉eg秧erPof范fs例et剩:=俯0DD1;D2id1:T1re饺alid2:T2T3in乳te盐ge翅r↑{抽T1.t倾yp珠e:帮=r今ea巩l;垄T1.w滤id还th奇:=返8悔}of鞋fs冬et盯:=药8nametypeoffsetid交1re栏al0en夹te峡r(酸id划1,动r腐ea览l,员0时)of脾fs乌et知:=底of旺fs汗et椒+874处理遭说明硬语句id圆1:溪r醒ea康l;充i稻d2捞:堂↑i揉nt意eg拥erPof唯fs燥et争:=油0DD1;D2id1:T1re侧alid2:T2T3in戒te渠ge随r↑{随T1.t薯yp皇e:盈=r贺ea饿l;拼T1.w里id套th蜡:=无8精}{栗T3.t糠yp闲e:兆=i盖nt匀eg栏er债;体T3.w悼id贺th樱:=部4含}of窄fs秩et影:=抄8of亏fs泉et略:=允12{蜜T2.t灰yp危e:屯=p疯oi洗nt掩er都(T3.t缘瑞yp精e)闯;涂T2.w摧id样th畏:=畜4恰}nametypeoffsetid论1re窃al0id港2po蚕in绿te乏r(辽in馆te政ge邀r)8en揭te跃r(遇id拴2,虏p房诚oi牢nt织er戏(i驶nt右eg邀er探),伙8魄)of果fs友et卫:=屡of怒fs贼et筑+4D葛T{t拴=沿T.鼓ty亿pe泻;诞w默=谦T.血wi销dt码h}id弟A炎{雪i萍d.录ty逢pe告=诉A粉.t钓yp恒e;珍i语d.蚂wi倍dt逼h=薄A.乒wi良dt纹h}Tin列t锣{T.ty宇pe:=in虽t;T.wi金dt算h:=揭4睡}Tdo嚼ub膛le泳{T.ty社pe:=轻r友ea柿l;T.wi预dt财h:=脸8松}Aε{筋A.飞ty找pe约=忧t迁;淡A.追wi刊dt抚h袜=快w;裤}A探[n泊um功]A1{A辨.t绳yp辟e=位ar藏ra西y(杆nu匠m.窗va尖lu民e,坡A1.t蛮yp反e;A.建wi粒dt哄h:=叛n舍um滥.v则al谨ueA1.w幼id腐th郑}TT1*{T.ty细pe:=po我in搁te郑r(T1.ty番pe);T.wi镇dt坛h:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论