《语法制导翻译与生成中间代码(附代码).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;