实验三中间代码生成学号:1152185;姓名:马小军实验目的1.了解并掌握中间代码的生成过程和作用2.了解并掌握四元式3.体会属性文法在中间代码生成过程中的作用。实验环境Windows7操作系统vs2010编程环境实验内容从文件中读入表达式,输出其四元式的结果序列本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式实验原理三、以逆波兰式为例的实验设计思想及算法(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。(3)如果不是数字,该字符则是运算符,此时需比较优先关系。做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。(4)重复上述操作(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。下面给出算法流程图NYendNYNYend打开文件成功调用scan()函数从文件读入表达式表达式中是否有括号输出所读入的表达式调用生成四元式函数siyuanshi()处理括号内的处理乘除加减和赋值运算sum=0输出成功输出错误提示实验步骤打开并运行软件根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可)运行输出结果例如将以下源文件放入test.txt运行结果a:=b*c+b*d思考同样的思路对算法进行适当改动就可以生成其它形式的中间代码【其他部分】设计原理和算法思想参考《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等附录代码#includestdlib.h#includefstream#includeiostream#includestdio.husingnamespacestd;#defineMAX100intm=0,sum=0;//sum用®?于®¨²计?算?运?算?符¤?的Ì?个?数ºy//m用®?于®¨²标À¨º记?输º?入¨?表À¨ª达ä?式º?中D字Á?符¤?的Ì?个?数ºycharJG='A';charstr[MAX];//用®?于®¨²存ä?输º?入¨?表À¨ª达ä?式º?inttoken=0;//左Á¨®括¤¡§号?的Ì?标À¨º志?/***********用®?于®¨²更¨¹改?计?算?后¨®数ºy组Á¨¦中D的Ì?值¦Ì**************/voidchange(inte){intf=e+2;charch=str[f];if(ch='A'&&ch='Z'){for(intl=0;lm+10;l++){if(str[l]==ch)str[l]=JG;}}if(str[e]='A'&&str[e]='Z'){for(inti=0;im;i++){if(str[i]==str[e])str[i]=JG;}}}voidchengchuchuli(inti,intm){i++;for(;i=m-1;i++)//处ä|理¤¨ª乘?除y运?算?{if(str[i]=='*'||str[i]=='/'){cout(str[i]str[i-1]str[i+1]JG)endl;change(i-1);str[i-1]=str[i]=str[i+1]=JG;sum--;JG=(char)(int)JG++;}}}voidjiajianchuli(intj,intm){j++;for(;j=m-1;j++)//处ä|理¤¨ª加¨®减?运?算?{if(str[j]=='+'||str[j]=='-'){cout(str[j]str[j-1]str[j+1]JG)endl;change(j-1);str[j-1]=str[j]=str[j+1]=JG;sum--;JG=(char)(int)JG++;}}}/*扫¦¡§描¨¨一°?遍À¨¦从䨮文?件t中D读¨¢入¨?表À¨ª达ä?式º?*/voidscan(FILE*fin){intp[MAX];charch='a';intc=-1,q=0;while(ch!=EOF){ch=getc(fin);while(ch==''||ch=='\n'||ch=='\t')ch=getc(fin);//消?除y空?格?和¨ª换?行D符¤?str[m++]=ch;if(ch=='='||ch=='+'||ch=='-'||ch=='*'||ch=='/')sum++;elseif(ch=='('){p[++c]=m-1;}elseif(ch==')'){q=m-1;chengchuchuli(p[c],q);//从䨮左Á¨®括¤¡§号?处ä|理¤¨ª到Ì?又®?括¤¡§号?jiajianchuli(p[c],q);JG=(char)(int)JG--;str[p[c]]=str[m-1]=JG;c--;JG=(char)(int)JG++;}}}voidsanyuanshi(){for(inti=0;i=m-1;i++)//处ä|理¤¨ª乘?除y运?算?{if(str[i]=='*'||str[i]=='/'){cout(str[i]str[i-1]str[i+1]JG)endl;change(i-1);str[i-1]=str[i]=str[i+1]=JG;sum--;JG=(char)(int)JG++;}}for(intj=0;j=m-1;j++)//处ä|理¤¨ª加¨®减?运?算?{if(str[j]=='+'||str[j]=='-'){cout(str[j]str[j-1]str[j+1]JG)endl;change(j-1);str[j-1]=str[j]=str[j+1]=JG;sum--;JG=(char)(int)JG++;}}for(intk=0;k=m-1;k++)//处ä|理¤¨ª赋3值¦Ì运?算?{if(str[k]=='='){JG=(char)(int)--JG;cout(str[k]str[k+1]str[k-1])endl;sum--;change(k+1);str[k-1]=JG;}}}voidmain(){charin[MAX];//用®?于®¨²接¨®收º?输º?入¨?输º?出?文?件t名?FILE*fin;//用®?于®¨²指?向¨°输º?入¨?输º?出?文?件t的Ì?指?针?cout请?输º?入¨?源¡ä文?件t名?(ꡧ包㨹括¤¡§后¨®缀Áo名?)ê?endl;//scanf(%s,in);cinin;;if((fin=fopen(in,r))==NULL)//判D断?输º?入¨?文?件t名?是º?否¤?正y确¨¡¤{cout打䨰开a词䨺法¤¡§分¤?析?输º?入¨?文?件t出?错䨪!endl;}cout*********三¨y元a式º?如¨?下?:êo*********endl;scan(fin);//调Ì¡Â用®?函¡¥数ºy从䨮文?件t中D读¨¢入¨?表À¨ª达ä?式º?sanyuanshi();if(sum==0)printf(成¨¦功|!ê?);elseprintf(有®D错䨪误¨®!ê?);//关?闭À?文?件tfclose(fin);system(pause);}