版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译系统设计实践实验项目三:语法制导翻译与生成中间代码学号:姓名:年级:学院:数计学院专业:计算机本组其它成员:学号姓名学号姓名实验时间:2016-2017学年第一学期任课教师:一、实验目的通过语法制导或翻译模式生成中间代码。二、实验内容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。三、设计思路1.分析过程主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用
2、,按序输出三地址语句。在本例程序中选用expr及num作为运算数。2.主要函数stringlink()stringelement()stringexpression()stringexpression_1()stringbiaodashi()stringbiaodashi_1()stringgetOperator()voidcondition(intL1,intL2)voidyuyifenxi_list()voidyuyifenxi_list_1()voidyuyifenxi(intnext,int&flag)voidreadfile()四、测试报告1.第一组测试:/字符串和数字的连接
3、/获取表达式中的元素对象处理表达式处理表达式/处理表达式,转为三地址输出递归一处理表达式,转为三地址输出判断并获取运算符输出if语句的条件的三地址代码生成并输出条件返回地址/递归一生成并输出条件返回地址判断关键字,调用相应的产生式分析/文件读入qinput-记事本文件也帛塞旦格式置看皿帮助与if(expr>num)expr=expr+白工prelseexpr-*expr+expr;图1-1输入待翻译代码E:X有关学习、询律二谄文分忻.年相情义分析如下:100:L1"HJtpt1G1:t2=tlW2:t3=num103:=t3104:±0=t2>t410S:1ft
4、ruetOgotoL10G:i££a_lse10注口t口L3L2;1(Jr:x5=expr108: t.6=expr109: ±7=th110:二土耳*t.7111:expr=tSL31112!t10=espr110: =expr*tlO1 14;t11=expr-11B:t-12=Til116:tia=t9tl2117;expr=t13PTOceF:sexitedafter0.Bl'NZsecrindsvrithfrt.uTrnv11iaCi请按任意犍继续.图1-2中间代码生成2.第二组测试:Jinput-文件CB嘉辑CE格式©查看M越助cae
5、xpr=巳豆口工+expr;expr=巳其pr*expr+巳xpr,图2-1输入待翻译代码12345Ab7s_yQKr口oooooooooo11-1i-l1-117-T-lIt-IBi-I1L-11Tuxy析Ar-pX5CDtt7xp6印卬1tot6isProcessexitedafter0.6506secondswithreturnvalue0请按任意键继续.图2-2中间代码生成3.第三组测试:错误待翻译代码input-记事本文件格式9)查看M帮劭QDexpr=expr+|,cipr=erpr*expr+expr;图3-1输入待翻译代码E:育关学习"信律*语义分析语义分析如下:10
6、0:tO-exprerror101:tl=102: t2=tl103: t3-tO+t2104:ewpH-105:t5-expr1Q6;t4=xpr*t5107:t6=exprIOS;t7=t61D9:t3=t4+-t7110:expr=18Processeditedafter0.7359secondswithreturnvalue0请椅任意建修绩.图3-2中间代码生成五、实验总结实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差
7、强人意,但毕竟还算有些收获了。另外,通过三次实验下来,对于一相信在通过自己以后的深入学个简易编译器的实现已经有了一个整体的构架了,习,一定能写出属于自己的编译器。六、附录代码#include<iostream>#include<algorithm>#include<conio.h>usingnamespacestd;intaddress=100;每条分析语句的地址intLID=0;表示过程执行到相应位置的地址符号inttID=0;用于替换表达式的标识符intip=0;stringshuru666;/存放从文件读入的字符串intmaxsize;/设置存放数组的
8、长度stringbiaodashi();/*字符串和数字的连接*/stringlink(stringa,intb)stringt=""dot+=b%10+'0'b/=10;while(b);reverse(t.begin(),t.end();returna+t;/*获取表达式中的元素对象*/stringelement()if(shuruip="expr"|shuruip="num")ip+;returnshuruip-1;)elseif(shuruip="(")(ip+;stringresult=b
9、iaodashi();if(shuruip=")")ip+;elseputs("Lack)");returnresult;)elseputs("error");return""/*处理表达式*/stringexpression_1(string&op)(if(shuruip="*"|shuruip="/")(op=shuruip;ip+;stringarg1=element();stringop_1="",result=link("t&q
10、uot;,tID+);stringarg2=expression_1(op_1);if(op_1="")op_1="="if(arg2="")cout<<address+<<":"<<""<<result<<"="<<arg1<<endl;elsecout<<address+<<":"<<""<<resul
11、t<<"="<<arg1<<""<<op_1<<""<<arg2<<endl;returnresult;)return""/*处理表达式*/stringexpression()(stringop="",result=link("t",tID+);stringarg1=element();stringarg2=expression_1(op);if(op="")(op=&qu
12、ot;=")if(arg2="")(cout<<address+<<":"<<""<<result<<"="<<arg1<<endl;)else(cout<<address+<<":"<<""<<result<<"="<<arg1<<""<<op&l
13、t;<""<<arg2<<endl;)returnresult;)/*递归-处理表达式,转为三地址输出*/stringbiaodashi_1(string&op)(stringresult=""if(shuruip="+"|shuruip="-")(op=shuruip;ip+;stringarg1=expression();stringop_1=""stringarg2=biaodashi_1(op_1);result=link("t"
14、,tID+);if(op_1="")(op_1="=")if(arg2="")(cout<<address+<<":"<<""<<result<<"="<<arg1<<endl;else(cout<<address+<<":"<<""<<result<<"="<<
15、arg1<<""<<op_1<<"<<arg2<<endl;)returnresult;)/*处理表达式,转为三地址输出*/stringbiaodashi()(stringarg1="",op=""if(shuruip="+"|shuruip="-")arg1=shuruip;ip+;arg1+=expression();stringarg2=biaodashi_1(op);stringresult=link("t&
16、quot;,tID+);if(op="")op="="if(arg2="")cout<<address+<<":"<<""<<result<<"="<<arg1<<endl;elsecout<<address+<<":"<<""<<result<<"="<<arg
17、1<<""<<op<<""<<arg2<<endl;returnresult;/*判断并获取运算符*/stringgetOperator()if(shuruip="="|shuruip="<>"|shuruip="<"|shuruip=">"|shuruip="<="|shuruip=">=")ip+;returnshuruip-1;)els
18、e(puts("error");)return"")/*输出if语句的条件的三地址代码*/L1,L2分别为if条件为true和false时候的跳转地址/获得表达式的运算符的左边内容/获得表达式的运算符/获得表达式的运算符的右边内容voidcondition(intL1,intL2)(stringresult=link("t",tID+);stringarg1=biaodashi();stringop=getOperator();stringarg2=biaodashi();if(arg2="")(cout<&
19、lt;""<<result<<"="<<arg1<<endl;)else(cout<<address+<<":"<<""<<result<<"="<<arg1<<""<<op<<""<<arg2<<endl;)cout<<address+<<":
20、"<<"iftrue"<<result<<"goto"<<"L"<<L1<<endl;cout<<address+<<":"<<"iffalse"<<result<<"goto"<<"L"<<L2<<endl;)/*判断关键字,调用相应的产生式分析*/voidyuyifenxi(i
21、ntnext,int&flag)(if(shuruip="expr")(ip+;if(shuruip="=")赋值语句转化为四元式ip+;stringarg1=biaodashi();stringarg2=""if(arg2="")cout<<address+<<":"<<"expr="<<arg1<<endl;)elseputs("error");)elseif(shuruip=&quo
22、t;if")/if的语义子程序(ip+;intL1=LID+;intL2=LID+;if(shuruip="(")(ip+;condition(L1,L2);)else(puts("Lack(");return;)if(shuruip=")")ip+;elseputs("Lack)");return;)printf("L%d:n",L1);yuyifenxi(next,flag);ip+;if(shuruip="else")printf("L%d:n",L2);ip+;yuyifenxi(next,flag);/while的语义子程序elseif(shuruip="while")(ip+;intL1=LID+;intL2=LID+;if(shuruip="(")(ip+;printf("L%d:n",L1);condition(L2,next);)else(puts("Lack(");return;)if(shuruip=")&qu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年苏州道路客运输从业资格证考试真题保过
- 2023年北京市初三二模道德与法治试题汇编:综合探究题
- 吉林师范大学《体育保健学》2021-2022学年第一学期期末试卷
- 吉林师范大学《健康教育学》2021-2022学年第一学期期末试卷
- 吉林师范大学《网络工程师认证》2021-2022学年期末试卷
- 餐饮业食品安全全员保障方案
- 吉林大学《振动分析及测试技术》2021-2022学年第一学期期末试卷
- 餐饮业发光字制作与效果展示方案
- 升职后的工作总结:提升团队协作
- 2024聘请法律顾问合同格式模板样本
- 团结友爱和睦相处主题班会
- 期中 (试题) -2024-2025学年外研版(三起)英语六年级上册
- 2024年车路云一体化系统建设与应用指南报告
- 2025届高考语文复习:鉴赏诗歌的语言(炼字、炼句、语言风格)+课件
- 2024年企业收购委托代理协议文件版
- DL∕T 5210.6-2019 电力建设施工质量验收规程 第6部分:调整试验
- 一例登革热合并凝血功能障碍患者的个案护理20190-7
- 门诊病历书写模板全
- 《图形创意设计》PPT课件(完整版)
- 全国医疗服务价格项目规范(2012版)
- 二年级乘除法口算题大全500题(可直接打印)
评论
0/150
提交评论