您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理语义分析报告
《编译原理》实验报告专业班级_软工1502姓名_赵翘楚_学号_20151107062_1.题目要求:1.1实验目的通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。1.2实验原理采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。2.算法分析2.1主程序示意图置初值结束调用scaner调用lrparser输出四元组图12.2设置语义过程emit(char*result,char*arg1,char*op,char*ag2)该函数功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:struct{charresult[8];charag1[8];charop[8];charag2[8];}quad[20];(2)char*newtemp()该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,….Char*newtemp(void){char*p;charm[8];p=(char*)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]=’t’;return(p);}2.3函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。3、实验步骤#includestdio.h#includestring.h#includestdlib.hcharprog[100],token[8],ch;char*rwtab[6]={begin,if,then,while,do,end};intsyn,p,m,n,sum,q;intkk;struct{charresult1[8];charag11[8];charop1[8];charag21[8];}quad[20];char*factor();char*expression();intyucu();char*term();intstatement();intlrparser();char*newtemp();scaner();emit(char*result,char*ag1,char*op,char*ag2);voidmain(){intj;q=p=kk=0;printf(\npleaseinputastring(endwith'#'):);do{scanf(%c,&ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();if(q19)printf(tolongsentense!\n);elsefor(j=0;jq;j++)printf(%s=%s%s%s\n\n,quad[j].result1,quad[j].ag11,quad[j].op1,quad[j].ag21);//getch();}intlrparser(){intschain=0;kk=0;if(syn==1){scaner();//读下一个单词符号schain=yucu();//调用语句串分析函数进行分析if(syn==6){scaner();//读下一个单词符号if((syn==0)&&(kk==0))printf(Success!\n);//输出(“success”)}else{if(kk!=1)printf(shortof'end'!\n);//输出‘缺end’错误kk=1;//getch();exit(0);}}else{printf(shortof'begin'!\n);//输出’begin’错误kk=1;//getch();exit(0);}return(schain);}intyucu(){intschain=0;schain=statement();//调用语句分析函数进行分析while(syn==26){scaner();//读下一个单词符号schain=statement();//调用语句分析函数进行分析}return(schain);}intstatement(){chartt[8],eplace[8];intschain=0;if(syn==10){strcpy(tt,token);scaner();if(syn==18){scaner();//读下一个单词符号strcpy(eplace,expression());emit(tt,eplace,,);schain=0;}else{printf(shortofsign':='!\n);//输出’缺少赋值号’的错误kk=1;//getch();exit(0);}return(schain);}}char*expression(){char*tp,*ep2,*eplace,*tt;tp=(char*)malloc(12);//分配空间ep2=(char*)malloc(12);eplace=(char*)malloc(12);tt=(char*)malloc(12);strcpy(eplace,term());//调用term分析产生表达式计算的第一项eplacewhile((syn==13)||(syn==14)){if(syn==13)strcpy(tt,+);//操作符tt=‘+’或者‘—’elsestrcpy(tt,-);scaner();//读下一个单词符号strcpy(ep2,term());//调用term分析产生表达式计算的第二项ep2strcpy(tp,newtemp());//调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2);//生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char*term()//仿照函数expression编写{char*tp,*ep2,*eplace,*tt;tp=(char*)malloc(12);ep2=(char*)malloc(12);eplace=(char*)malloc(12);tt=(char*)malloc(12);strcpy(eplace,factor());while((syn==15)||(syn==16)){if(syn==15)strcpy(tt,*);elsestrcpy(tt,/);scaner();//读下一个单词符号strcpy(ep2,factor());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);strcpy(eplace,tp);}return(eplace);}char*factor(){char*fplace;fplace=(char*)malloc(12);strcpy(fplace,);if(syn==10){strcpy(fplace,token);scaner();//读下一个单词符号}elseif(syn==11){itoa(sum,fplace,10);scaner();//读下一个单词符号}elseif(syn==27){scaner();//读下一个单词符号fplace=expression();//调用expression分析返回表达式的值if(syn==28)scaner();//读下一个单词符号else{printf(erroron')'!\n);kk=1;//getch();exit(0);}}else{printf(erroron'('!\n);kk=1;//getch();exit(0);}return(fplace);}char*newtemp(){char*p;charm[8];p=(char*)malloc(8);kk++;itoa(kk,m,10);strcpy(p+1,m);p[0]='t';return(p);}scaner(){sum=0;for(m=0;m8;m++)token[m++]=NULL;m=0;ch=prog[p++];while(ch=='')ch=prog[p++];if(((ch='z')&&(ch='a'))||((ch='Z')&&(ch='A'))){while(((ch='z')&&(ch='a'))||((ch='Z')&&(ch='A'))||((ch='0')&&(ch='9'))){token[m++]=ch;ch=prog[p++];}p--;syn=10;token[m++]='\0';for(n=0;n6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif((ch='0')&&(ch='9')){while((ch='0')&&(ch='9')){sum=sum*10+ch-'0';ch=prog[p++];}p--;syn=11;}elseswitch(ch){case'':m=0;ch=prog[p++];if(ch==''){syn=21;}elseif(ch=='='){syn=22;}else{syn=20;p--;}break;case'':m=0;ch=prog[p++];if(ch=='='){syn=24;}else{syn=23;p--;}break;case':':m=0;ch=prog[p++];if(ch=='='){syn=18;}else{syn=17;p--;}break;case'+':syn=13;break;case'-':syn=14;break;case'*':syn=15;break;case'/':syn=16;break;case'(':syn=27;break;case')':syn=28;break;case'=':syn=25;break;case';':syn=26;break;case'#':syn=0;break;default:syn=-1;break;}}emit(char*result,char*ag1,char*op,char*ag2){strcpy(quad[q].result1,result);strcpy(quad[q].ag11,ag1);strcpy(quad[q].op1,op);strcpy(quad[q].ag21,ag2);q++;}4、实验结果实验的输入和输出:输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。例如:对于语句串begina:=2+3*4;x:=(a+b)/cend#输出的三地址指令如下:(1)t1=3*4(2)t2=2+t1(3)a=t2(4)t3=a+b(5)t4=t3/c(6)x=t4
本文标题:编译原理语义分析报告
链接地址:https://www.777doc.com/doc-3259343 .html