您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 语法制导翻译与生成中间代码(附代码)
《编译系统设计实践》实验项目三:语法制导翻译与生成中间代码学号:姓名:年级:学院:数计学院专业:计算机本组其它成员:学号姓名学号姓名实验时间:2016-2017学年第一学期任课教师:一、实验目的通过语法制导或翻译模式生成中间代码。二、实验内容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。三、设计思路1.分析过程主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用,按序输出三地址语句。在本例程序中选用expr及num作为运算数。2.主要函数stringlink()三组测试:错误待翻译代码图3-1输入待翻译代码图3-2中间代码生成五、实验总结实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差强人意,但毕竟还算有些收获了。另外,通过三次实验下来,对于一个简易编译器的实现已经有了一个整体的构架了,相信在通过自己以后的深入学习,一定能写出属于自己的编译器。六、附录代码#includeiostream#includealgorithm#includeusingnamespacestd;intaddress=100;//每条分析语句的地址intLID=0;//表示过程执行到相应位置的地址符号inttID=0;//用于替换表达式的标识符intip=0;stringshuru[666];//存放从文件读入的字符串intmaxsize;//设置存放数组的长度stringbiaodashi();/*****字符串和数字的连接*****/stringlink(stringa,intb){stringt=;do{t+=b%10+'0';b/=10;}while(b);reverse(),());returna+t;}/*****获取表达式中的元素对象*****/stringelement(){if(shuru[ip]==expr||shuru[ip]==num){ip++;returnshuru[ip-1];}elseif(shuru[ip]==(){ip++;stringresult=biaodashi();if(shuru[ip]==))ip++;elseputs(Lack));returnresult;}elseputs(error);return;}/*****处理表达式*****/stringexpression_1(string&op){if(shuru[ip]==*||shuru[ip]==/){op=shuru[ip];ip++;stringarg1=element();stringop_1=,result=link(t,tID++);stringarg2=expression_1(op_1);if(op_1==)op_1==;if(arg2==)coutaddress++:result=arg1endl;elsecoutaddress++:result=arg1op_1arg2endl;returnresult;}return;}/*****处理表达式*****/stringexpression(){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(shuru[ip]==+||shuru[ip]==-){op=shuru[ip];ip++;stringarg1=expression();stringop_1=;stringarg2=biaodashi_1(op_1);result=link(t,tID++);if(op_1==){op_1==;}if(arg2==){coutaddress++:result=arg1endl;}else{coutaddress++:result=arg1op_1arg2endl;}}returnresult;}/*****处理表达式,转为三地址输出*****/stringbiaodashi(){stringarg1=,op=;if(shuru[ip]==+||shuru[ip]==-){arg1=shuru[ip];ip++;}arg1+=expression();stringarg2=biaodashi_1(op);stringresult=link(t,tID++);if(op==){op==;}if(arg2==){coutaddress++:result=arg1endl;}else{coutaddress++:result=arg1oparg2endl;}returnresult;}/*****判断并获取运算符*****/stringgetOperator(){if(shuru[ip]===||shuru[ip]==||shuru[ip]==||shuru[ip]==||shuru[ip]===||shuru[ip]===){ip++;returnshuru[ip-1];}else{puts(error);}return;}/*****输出if语句的条件的三地址代码*****/voidcondition(intL1,intL2)//L1,L2分别为if条件为true和false时候的跳转地址{stringresult=link(t,tID++);stringarg1=biaodashi();//获得表达式的运算符的左边内容stringop=getOperator();//获得表达式的运算符stringarg2=biaodashi();//获得表达式的运算符的右边内容if(arg2==){coutresult=arg1endl;}else{coutaddress++:result=arg1oparg2endl;}coutaddress++:iftrueresultgotoLL1endl;coutaddress++:iffalseresultgotoLL2endl;}/*****判断关键字,调用相应的产生式分析*****/voidyuyifenxi(intnext,int&flag){if(shuru[ip]==expr){ip++;if(shuru[ip]===)//赋值语句转化为四元式{ip++;stringarg1=biaodashi();stringarg2=;if(arg2==)coutaddress++:expr=arg1endl;}elseputs(error);}elseif(shuru[ip]==if)//if的语义子程序{ip++;intL1=LID++;intL2=LID++;if(shuru[ip]==(){ip++;condition(L1,L2);}else{puts(Lack();return;}if(shuru[ip]==))ip++;else{puts(Lack));return;}printf(L%d:\n,L1);yuyifenxi(next,flag);ip++;if(shuru[ip]==else){printf(L%d:\n,L2);ip++;yuyifenxi(next,flag);}}elseif(shuru[ip]==while)//while的语义子程序{ip++;intL1=LID++;intL2=LID++;if(shuru[ip]==(){ip++;printf(L%d:\n,L1);condition(L2,next);}else{puts(Lack();return;}if(shuru[ip]==))ip++;else{puts(Lack));return;}printf(L%d:\n,L2);yuyifenxi(next,flag);printf(gotoL%d\n,L1);flag=1;}}/*****递归---生成并输出条件返回地址*****/voidyuyifenxi_list_1(){if(shuru[ip]==;){ip++;intnext=LID++;intflag=0;yuyifenxi(next,flag);if(flag)printf(L%d:\n,next);yuyifenxi_list_1();}}/*****生成并输出条件返回地址*****/voidyuyifenxi_list(){intnext=LID++;intflag=0;yuyifenxi(next,flag);if(flag)printf(L%d:\n,next);yuyifenxi_list_1();}voidModular(){intnext=LID++;intflag=0;yuyifenxi_list();if(flag)printf(L%d:\n,next);}/*****文件读入*****/voidreadfile()//将字符串输入到shuru中{maxsize=0;while(cinshuru[maxsize])maxsize++;}/*****主函数*****/intmain(){freopen(,r,stdin);cout语义分析如下:endl;readfile();Modular();return0;}
本文标题:语法制导翻译与生成中间代码(附代码)
链接地址:https://www.777doc.com/doc-6190618 .html