您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码 北京交通大学
语义分析及中间代码生成程序设计原理与实现技术XXX1028XXX2计科1XXX班1.程序功能描述完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过程。G[A]:A→V:=EE→E+T∣E-T∣T→T*F∣T/F∣FF→(E)∣iV→i说明:终结符号i为用户定义的简单变量,即标识符的定义。2.设计要求(1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。3.主要数据结构描述:本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改的,所以主要的数据结构也跟第四次差不多,主要为文法的表示,FirstVT集和LastVT集以及算符优先矩阵:算符优先矩阵采用二维字符数组表示的:charmtr[9][9];//算符优先矩阵4.程序结构描述:structinfo{charleft;vectorstringright;vectorcharfirst;vectorcharlast;};本程序一共有8功能函数:voidget();//获取文法voidprint();//打印文法voidfun();//求FirstVT和LastVTvoidmatrix();//求算符优先矩阵voidtest();//测试文法intcmp(chara,charb);比较两个运算符的优先级10-1voidout(charnow,intavg1,intavg2);//打印四元式intope(charop,inta,intb);//定义四元式计算方法5.实验代码详见附件6.程序测试6.1功能测试程序运行显示如下功能菜单:选择打印文法:选择构造FirstVt集和LastVT集:选择构造算符优先矩阵:6.2文法测试测试1:1+2*3测试2:2+3+4*5+(6/2)7.学习总结本次实验完成了语义及中间代码生成的设计原理与实现,所采用的方法为算符优先分析方法,首先根据文法求出此文法的FirstVT集和LastVT集,然后根据他们求出此文法的算符优先矩阵。由于此文法和第四次文法基本相同,只是多了一条赋值语句,所以采用的规则和第四次基本相同。在分析阶段,每当遇到有规约的项目,判断一下,打印出此部运算的四元式,这样一步一步分析,知道输入的算术表达式计算分析完毕。由于本次实验部分代码和第四次实验的代码比较相似,只需增加一点四元式的分析计算打印过程,就能够顺利完成本次实验。通过这次实验,我对语义分析以及中间代码部分有了一定的提高,对以后的学习有了一定程度上的帮助。//lb6.cpp:定义控制台应用程序的入口点。//#includestdafx.h#includeiostream#includestring#includeVECTOR#includestackusingnamespacestd;structinfo{charleft;vectorstringright;vectorcharfirst;vectorcharlast;};vectorinfolang;charmtr[9][9];//算符优先矩阵stackcharsta;voidget();//获取文法voidprint();//打印文法voidfun();//求FirstVT和LastVTvoidmatrix();//求算符优先矩阵voidtest();//测试文法intcmp(chara,charb);//比较两个运算符的优先级10-1voidout(charnow,intavg1,intavg2);//打印四元式intope(charop,inta,intb);//定义四元式计算方法intmain(){intchoose;while(1){cout****************************************endl;cout获取文法请按1endl;cout打印文法请按2endl;cout构造FirstVT集和LastVT集请按3endl;cout构造优先关系矩阵请按4endl;cout文法测试请按5endl;cout结束请按0endl;cout****************************************endl;coutendl;cinchoose;if(choose==0)break;switch(choose){case1:get();break;case2:print();break;case3:fun();break;case4:matrix();break;case5:test();break;default:break;}}return0;}voidget(){infotemp,temp1,temp2;temp.left='E';temp.right.push_back(E+T);temp.right.push_back(E-T);temp.right.push_back(T);temp.right.push_back(i);temp1.left='T';temp1.right.push_back(T*F);temp1.right.push_back(T/F);temp1.right.push_back(F);temp2.left='F';temp2.right.push_back((E));temp2.right.push_back(i);lang.push_back(temp);lang.push_back(temp1);lang.push_back(temp2);cout****************************************endl;cout文法获取完成endl;cout****************************************endl;coutendl;}voidprint(){cout****************************************endl;for(inti=0;ilang.size();i++){for(intj=0;jlang[i].right.size();j++){coutlang[i].left--;coutlang[i].right[j]endl;}}cout****************************************endl;coutendl;}voidfun(){inti,j,sign=0,sign1=0;for(i=0;ilang.size();i++){for(j=0;jlang[i].right.size();j++){stringtemp=lang[i].right[j];//获取右部if(temp[0]'Z'||temp[0]'A'){//终结符lang[i].first.push_back(temp[0]);}elseif(temp.length()=2){//终结符if(temp[1]'Z'||temp[1]'A'){lang[i].first.push_back(temp[1]);}}}}for(i=0;ilang.size();i++){for(j=0;jlang[i].right.size();j++){stringtemp=lang[i].right[j];//获取右部if((temp[0]'Z'||temp[0]'A')&&temp.length()==1){//终结符lang[i].last.push_back(temp[0]);}elseif(temp.length()=3){//终结符if(temp[1]'Z'||temp[1]'A')lang[i].last.push_back(temp[1]);elseif(temp[2]'Z'||temp[2]'A')//终结符lang[i].last.push_back(temp[2]);}}}while(sign==0){//迭代FirstVTsign=1;for(i=0;ilang.size();i++){for(j=0;jlang[i].right.size();j++){stringtemp=lang[i].right[j];//获取右部if(temp.length()==1&&(temp[0]='Z'&&temp[0]='A')){//可以迭代for(intk=0;klang.size();k++){if(lang[k].left==temp[0]){//找到了,添加元素for(intp=0;plang[k].first.size();p++){sign1=0;charch=lang[k].first[p];for(intq=0;qlang[i].first.size();q++){if(lang[i].first[q]==ch){//包含了sign1=1;}}if(sign1==0){lang[i].first.push_back(ch);sign=0;}}}}}}}}sign=0;while(sign==0){//迭代LastVTsign=1;for(i=0;ilang.size();i++){for(j=0;jlang[i].right.size();j++){stringtemp=lang[i].right[j];//获取右部if(temp.length()==1&&(temp[0]='Z'&&temp[0]='A')){//可以迭代for(intk=0;klang.size();k++){if(lang[k].left==temp[0]){//找到了,添加元素for(intp=0;plang[k].last.size();p++){sign1=0;charch=lang[k].last[p];for(intq=0;qlang[i].last.size();q++){if(lang[i].last[q]==ch){//包含了sign1=1;}}if(sign1==0){lang[i].last.push_back(ch);sign=0;}}}}}}}}cout****************************************endl;coutFirstVT:endl;for(i=0;ilang.size();i++){coutlang[i].left:;for(j=0;jlang[i].first.size();j++){coutlang[i].first[j];}coutendl;}coutendl;coutLasttVT:endl;for(i=0;ilang.size();i++){coutlang[i].left:;for(j=0;jlang[i].last.size();j++){coutlang[i].last[j];}coutendl;}cout****************************************endl;coutendl;}voidmatrix(){inti,j;for(i=0;i9;i++){//初始化for(j=0;j9;j++){mtr[i][j]='n';}}stringtemp=+-*/()i#;for(i=1;i9;i++){mtr[i][0]=temp[i-1];mtr[0][i]=temp[i-1];}vectorstringstr;for(i=0;ilang.size();i++
本文标题:语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码 北京交通大学
链接地址:https://www.777doc.com/doc-4276443 .html