欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    第6章 语法制导翻译和中间代码生成Tsu版电Word文档下载推荐.docx

    • 资源ID:17305074       资源大小:21.83KB        全文页数:16页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第6章 语法制导翻译和中间代码生成Tsu版电Word文档下载推荐.docx

    1、 /NI表示整常数表长度float const_real_tableNR; /NR表示实常数表长度 常数表使用常数表地址使用说明6.3 中间代码6.3.1 三元式格式 OP ARG1 ARG2运算符第一运算量第二运算量优点代码生成无需引进临时变量。缺点 调整困难。6.3.2 四元式 OP ARG1 ARG2 RESULT运算结果调整方便。在生成中间代码时引进大量临时变量。临时变量的处理将Ti作为标识符存入符号表设置临时变量表6.4 说明语句(简单变量)的翻译文法及修改integer SaVreal ScV SV,标识符 VV,iinteger 标识符 Vaireal 标识符 Vci用这个文法来

    2、制导翻译,每当读进一个标识符,就可把它的变量名及其性质填入符号表,没有必要集中起来成批处理。语义子程序Vai fill_sym_table(wval,0,0); /填写符号表(标识符名,简单变量,整型) V.cat=0; /保存语义值(简单变量) V.type=0; /保存语义值(整型) Vci fill_sym_table(wval,0,1); /保存语义值(简单变量) V.type=1; /保存语义值(实型) VV(1),i fill_sym_table(wval, V(1).cat, V(1).type); /继承V(1)的语义信息 V.cat= V(1).cat; V.type= V(

    3、1).type;SV ; /空语义变量.cat和.typefill_sym_table函数手工计算interger a, b 6.5 整型算术表达式及赋值语句的翻译文法标识符= Si=X+ XX+Y XY* YY*Z YZ() Z(X)- Si=X XX+Y XY) Z(X)标识符 Zi 无符号实常数 Zy语义子程序(XX+Y)void *t; XX(1)+Y if(X(1) .type=Y.type) /类型相同if(X(1).type=0) /int op int gen_code(+i,X(1).addr, Y.addr, X.addr);X .type=0;else /real=rea

    4、lX.addr = get_tmpvar(1);gen_code(+r,X(1).addr, Y.addr, X.addr);X .type=1; else /类型不相同 /结果类型均为实型t=get_tmpvar(1); /申请临时变量(实型),用于类型转换。 if(X(1) .type=0) / int op realgen_code (itr,X(1).addr,0,t);gen_code (+r,t,Y.addr, X.addr); else /real op int gen_code (itr,Y.addr,0,t);gen_code (+r, X(1).addr,t, X.addr

    5、); 6.7 布尔表达式的翻译布尔表达式作用控制语句的条件 if x+yy程序设计语言的优先级和结合性标准Fortran语言(按表达式类别分级)Pascal语言(共分4级,同级运算优先性相同)C语言(共分17级,同级运算优先性相同)描述布尔表达式文法以标准FORTRAN语言为基础,适当化简。EEE|EE|(E)|E|XrX|XXX+X|X*X| (X)|-X|i|x布尔表达式计算方法根据优先性和结合性按步计算优化计算法布尔表达式的第一种翻译法同算术表达式布尔表达式的第二种翻译法 概述实例引入问题的提出解决办法1)修改文法 2)引进语义变量.tc和.fc保存未填转移目标的四元式地址 3)变量和函

    6、数 nxq指示器 链合并函数merg(p1,p2) 回填函数backpatch(p,t)语义子程序EX E.tc = nxq;gen_code(jnz,X.addr,0,0); E.fc = nxq; gen_code(jmp,0,0,0); ErXrX(1) E.tc = nxq; E.tc:=nxq+1; gen_code(jr,X.addr, X(1).addr,0); gen_code(jmp,0,0,0) EE(1) /真假出口链链首互换E.tc = E(1).fc; E.fc = E(1).tc;E(E(1) /传递真假出口链链首E.tc= E(1).tc; E.fc = E(1)

    7、.fc;EAE backpatch(E.tc,nxq); /可填真出口(下一个四元式地址) EA.fc = E.fc; /传递假出口链链首EEAE(2) E.tc = E(2).tc; /传递真出口链链首 E.fc = merge(EA.fc, E(2).fc); /合并假出口链 EOE(1) EO.tc = E(1).tc;backpatch(E(1).fc,nxq); /可填假出口(下一个四元式地址)EEOE(2) E.tc = merge(EO.tc, E(2).tc); /合并真出口链E.fc = E(2).fc; /传递假出口链链首XiX.addr = sym_entry(wval)

    8、; / wval表示单词的值。XxX.addr = const_int_entry(atoi(wval); / wval表示单词的值。手工计算 abc6.8 标号和无条件转移语句的翻译标号和goto语句向后转移(程序首部方向)向前转移(程序尾部方向)文法及修改 SFS标识符: Fi:问题的提出和解决办法 goto L99是一个向后转移语句 goto L99是一个向前转移语句 L99第一次出现 L99非第一次出现语义子程序(不考虑出错情况)Fi: if(sym_entry(wval)=0) /标号未进入符号表,属先定位后使用。 fill_sym_table(wval,1,1); /将标号名填入符

    9、号表且标记已定位 (*sym_entry(wval).addr=nxq; /nxq为标号i标领的语句第一个四元式地址 else /标号已进入符号表,属先使用后定位,此时应回填。 backpatch(*sym_entry(wval).addr,nxq); /回填 (*sym_entry(wval).type=1; /标号已定位Sgi if(sym_entry(wval)=0) /*标号未进入符号表,属先使用后定位且是第一个向前转移语句,此时产生新链,链中仅有一个四元式。*/ fill_sym_table(wval,1,0); /将标号名填入符号表且标记为未定位 /下一个无条件转移四元式地址(编号

    10、) /产生不完全四元式 else /标号已进入符号表if (*sym_entry(wval).type=1)/标号已进入符号表且定位,直接产生四元式。 gen_code(jmp,0,0, (*sym_entry(wval).addr);else /*标号已进入符号表,但未定位,即有以该标号为转移目标的单向链存在,将新产生的四元式插入单向链。t =(*sym_entry(wval).addr; (*sym_entry(wval).addr=nxq; gen_code(jmp,0,0,t);SFS ; /暂时可认为是空6.9 控制语句的翻译语义变量E.fc的传递引进语义变量.chain6.9.1

    11、if-then语句的翻译ifthenendif SfEtS(1)j 标识符= Si=X为了能及时回填真出口,文法修改如下: Cifthen CfEtC endif SCS(1)j CfEt backpatch(E.tc,nxq); /回填真出口 C.chain=E.FC; /假出口是离开if-then语句SCS(1)j S.chain=merge(C.chain, S(1).chain); /S(1)中可能含有离开if_then的四元式Si=X /赋值语句按顺序执行,它的四元式代码中不存在需回填转移目标的四元式。 S.chain=0; gen_code(=,X.addr,0,sym_entry

    12、(wval);if a then b=d endif6.9.2 if-then-else语句的翻译else SfEtS(1)eS(2)当扫描到then可填真出口,当扫描到else可填假出口,当S(1)执行完毕,应离开if-then-else语句。为了能及时回填四元式,修改如下:TP STPS(2) TPCelse TPCS(1)ethen CfEtTPCS(1)e / TP可理解为then-processedt = nxq; /t为下一条四元式地址,即(jmp,0,0,0)的地址(编号)。 gen_code(jmp,0,0,0); /执行完S(1)后,离开if-then-else语句。 bac

    13、kpatch(C.chain, nxq); /回填假出口,这里C.chain相当于E.FC,此时nxq=t+1。 TP.chain = merge(S(1).chain, t); /S(1)中可能含有离开if_then-else的四元式STPS(2) S.chain = merge(TP.chain,S(2).chain); /S(2)中可能含有离开if_then-else的四元式 CfEt /见6.9.1if a then b=c else b=d6.9.3 while-do语句的翻译whiledo SwEdS(1)为了便于语义分析,修改如下: Wwhile Ww WdWdo WdWEd W

    14、d SWd S(1)Ww W.quad=nxq; /记录E的第一个四元式编号WdWEd / Wd可理解为while-dobackpatch(E.TC,nxq); Wd.chain =E.fc; /传递假出口、即while-do的出口。 Wd.quad= W.quad; /传递E的第一个四元式地址SWdS(1) backpatch(S(1).chain, Wd.quad); /*回填S(1).chain链,因S(1)可能是控制语句,离开S(1) 的四元式的转移目标是E的第一个四元式。 */gen_code(jmp,0, 0,Wd.quad); /生成转向E首址的无条件转移指令S.chain =

    15、Wd.chain; /传递假出口、即while-do的出口。 while a do if b then c=d endif6.9.4 复合语句的翻译begin end SL; LL(1); LS分号意味着一个语句的结束,当扫描到分号,就可回填转移目标。为了能及时回填chain链,文法修改如下:LS LLSSLSd do beginc=c-1;d=d+1end end根据上述语义子程序,其相应四元式序列为: (jnz,&a,0,03) /if (jmp,0,0,04) (=,&10,0,&b) (j,&c,&d,06) /while (jmp,0,0,011) (-,&1,&T1) (=,&T1,0,&c) (+,&d,&T2) (=,&T2,0,&d) (jmp,0,0,4) (halt,0,0,0)6.10 小结


    注意事项

    本文(第6章 语法制导翻译和中间代码生成Tsu版电Word文档下载推荐.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开