语法制导翻译与生成中间代码(附代码).docx

上传人:scccc 文档编号:14592677 上传时间:2022-02-09 格式:DOCX 页数:13 大小:89.64KB
返回 下载 相关 举报
语法制导翻译与生成中间代码(附代码).docx_第1页
第1页 / 共13页
语法制导翻译与生成中间代码(附代码).docx_第2页
第2页 / 共13页
语法制导翻译与生成中间代码(附代码).docx_第3页
第3页 / 共13页
语法制导翻译与生成中间代码(附代码).docx_第4页
第4页 / 共13页
语法制导翻译与生成中间代码(附代码).docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《语法制导翻译与生成中间代码(附代码).docx》由会员分享,可在线阅读,更多相关《语法制导翻译与生成中间代码(附代码).docx(13页珍藏版)》请在三一文库上搜索。

1、编译系统设计实践实验项目三:语法制导翻译与生成中间代码学号:姓名:年级:学院:数计学院专业:计算机本组其它成员:学号姓名学号姓名实验时间:20162017学年第一学期任课教师:一、实验目的通过语法制导或翻译模式生成中间代码。二、实验内容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。三、设计思路1 .分析过程主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用

2、,按序输出三地址语句。在本例程序中选用expr及num作为运算数。2 .主要函数stringlink()11input-记事本交件CB漏弱|耳格式丝苣看yif(exprnum)expr=expr+expr;elseexpr-expr*expr+sxpr;E肓关学习、镰译适次分忻,。已语10L2L3421.14 t0 t口三567 t t t7 8 o.- uoo 1 -1 1CO t111,23 1E IX12i-i 一 七卜139 L t6 71- 11 1after 0. 8122 seconds wilh re tujrn val ue 0Rd线士士i1Ptqsss请按任意.11inpu

3、t-记事本文件旧编辑裕式查看团耗助回expr=expr+expr;expr=expr*expr+巳xpr.K3e;有美学习专谭演义分析,已语义分析如F:100;tO-expr101: tl=expr102: t2=tl103: t3=tO+t2104:expr=t3105:t5=expr106: t4-expr*tE107: t6-expr108:t7=t6109:t8=t4+t7110:expr=t8Processexited,after0,6506secondswithreturnvalueU三组测试:错误请按任意键继续.待翻译代码input-记事本文件是辑格式查看区)帮助回ejtpr=e

4、xpr+|,expr=erpr*expr+expr;图3-1输入待翻译代码E;可美学习i病津诺义分析语义分析如下:100:tO-exprerror101:tl=102:t2=tl103;t3=tO+t2104:expT-t2105:5=expr106:t4=expr*15107:t6=expr108: t7=t6log:ts=t4+t7110:expr=t8Processesitedafter0.7359secondswithreturnvalue0图3-2中间代码生成五、实验总结实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查

5、阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差强人意,但毕竟还算有些收获了。另外,通过三次实验下来,对于一个简易编译器的实现已经有了一个整体的构架了,相信在通过自己以后的深入学习,一定能写出属于自己的编译器。六、附录代码#include#include#includeusingnamespacestd;intaddress=100;/每条分析语句的地址intLID=0;/表示过程执行到相应位置的地址符号inttID=0;/用于替换表达式的标识符intip=0;stringshuru666;/存放从文件读入的字符串intmaxsize;/设

6、置存放数组的长度stringbiaodashi();/*字符串和数字的连接*/stringlink(stringa,intb)stringt=;dot+=b%10+0;b/=10;while(b);reverse(),();returna+t;/*获取表达式中的元素对象*/stringelement()if(shuruip=expr|shuruip=num)ip+;returnshuruip-1;elseif(shuruip=()stringresult=biaodashi();if(shuruip=)ip+;elseputs(Lack);returnresult;elseputs(error

7、);return;/*处理表达式*/stringexpression_1(string&op)if(shuruip=*|shuruip=/)op=shuruip;ip+;stringarg1=element();stringop_1=,result=link(t,tID+);stringarg2=expression_1(op_1);if(op_1=)op_1=;if(arg2=)coutaddress+:result=arg1endl;arg2endl;elsecoutaddress+:result=arg1op_1returnresult;return;/*处理表达式*/stringexp

8、ression()stringop=,result=link(t,tID+);stringarg1=element();stringarg2=expression_1(op);if(op=)op=;)if(arg2=)coutaddress+:result=arg1endl;)else(coutaddress+:result=arg1oparg2endl;)returnresult;)/*递归一处理表达式,转为三地址输出*/stringbiaodashi_1(string&op)(stringresult=;if(shuruip=+|shuruip=-)(op=shuruip;ip+;stri

9、ngarg1=expression();stringop_1=;stringarg2=biaodashi_1(op_1);result=link(t,tlD+);if(op_1=)(op_1=;)if(arg2=)(coutaddress+:result=arg1endl;)elsecoutaddress+:result=arg1op_1arg2endl;)returnresult;)/*处理表达式,转为三地址输出*/stringbiaodashi()(stringarg1=,op=;if(shuruip=+|shuruip=-)arg1=shuruip;ip+;arg1+=expressio

10、n();stringarg2=biaodashi_1(op);stringresult=link(t,tlD+);if(op=)(op=;)if(arg2=)(coutaddress+:result=arg1endl;)else(coutaddress+:result=arg1oparg2endl;)returnresult;)/*判断并获取运算符*/stringgetOperator()(if(shuruip=|shuruip=|shuruip=|shuruip=)ip+;returnshuruip-1;)else(puts(error);)return)/*输出if语句的条件的三地址代码*

11、/void condition(int L1 ,int L2)/L1,L2分别为if条件为true和false时候的跳转地址stringresult=link(t,tlD+);string arg1=biaodashi();/获得表达式的运算符的左边内容string op=getOperator();获得表达式的运算符string arg2=biaodashi();/获得表达式的运算符的右边内容ip+;if(arg2=)cout result=arg1endl;elsecoutaddress+:result=arg1oparg2endl;)coutaddress+:iftrueresultgo

12、toLL1endl;coutaddress+:iffalseresultgotoLL2endl;)/*判断关键字,调用相应的产生式分析*/voidyuyifenxi(intnext,int&flag)(if(shuruip=expr)if(shuruip=)/赋值语句转化为四元式ip+;ip+;stringarg1=biaodashi();stringarg2=;if(arg2=)coutaddress+:expr=arg1shurumaxsize)maxsize+;/*主函数*/intmain()freopen(,r,stdin);cout语义分析如下:endl;readfile();Modular();return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1