一、实验名称1.SLR(1)分析法二、实验目的1.掌握自底向上语法分析方法的原理;2.编程完成LR分析法。三、实验内容和要求1.本实验要求对SLR(1)文法构造其分析表,并用LR分析技术实现对输入串的句型分析,具体包括两个程序:2.程序B:用LR分析技术对输入串进行句型分析。四、实验环境1.WindowsPC2.VS2017五、算法设计思想1.定义一结构体存储语法typedefstructgram{2charleft;charright[M];}_grammer;/*存储语法语句的结构体*/2.定义一结构体存储SLR(1)分析表,ACTION表与GOTO表存在同一张表中typedefstructtab{charaction;unsignedintgo_to;}_table;3.主要处理过程在output_process函数中,首先将第一次分析单独处理;再进而分析“移进、归约、接受、错误”的情况;4.将各个要处理的模块定义为函数分别处理;intinput_vn(charVn[]);输入Vnintinput_vt(charVt[]);输入Vtintinput_grammer(_grammergra[]);输入文法产生式intoutput_grammer(_grammergra[]);输出文法产生式intinput_table(_tabletable[][M],intmaxvn,intmaxvt);输入SLR(1)分析表3intoutput_table(_tabletable[][M],intmaxvn,intmaxvt);输出SLR(分析表)intget_str(charstr[],int&i);输入要分析的句子intoutput_process(_tabletable[][M],charstr[],_grammergra[],intmaxstr);识别句子六、主要问题与解决方法1.无;七、实验结果45九、源代码#includecstdio#includestring#includecstring#includecstdlib#includeiostream#includeiomanipusingnamespacestd;#defineM30typedefstructgram{charleft;charright[M];}_grammer;/*存储语法语句的结构体*/typedefstructtab{charaction;unsignedintgo_to;}_table;/*************---------函数声明----------**********************/intinput_vn(charVn[]);intinput_vt(charVt[]);intinput_grammer(_grammergra[]);intoutput_grammer(_grammergra[]);intget_maxgra(_grammergra[]);intinput_table(_tabletable[][M],intmaxvn,intmaxvt);intoutput_table(_tabletable[][M],intmaxvn,intmaxvt);6intget_str(charstr[],int&i);intoutput_process(_tabletable[][M],charstr[],_grammergra[],intmaxstr);//intinput_ACTION_table(intmaxvt,charmid[][M],char*table[M][M]);intmain(){system(colorB1);/***********************************变量定义***********************/charVn[M]=,Vt[M]=;charstr[M]=;intmaxvn,maxvt,maxgra,maxstr,again=1;_grammergra[M]={};/*存储语法下标+1为语法的序号*/_tabletable[M][M]={};/*存储SLR(1)分析表*///charACTION[M][M];/*ACTION(1)表中的各个值*///char*tableACT[M][M];/*指向LL(1)分析表中的各个值*/input_vn(Vn);/*输入Vn*/input_vt(Vt);/*输入Vt*/maxvn=strlen(Vn)-1;maxvt=strlen(Vt)-1;input_grammer(gra);/*输入文法*/output_grammer(gra);/*输出输入的语法*/maxgra=get_maxgra(gra);/*得到语法的最大条数*/input_table(table,maxvn,maxvt);/*输入SLR(1)分析表*/output_table(table,maxvn,maxvt);/*输出SLR(1)分析表*/while(again==1){get_str(str,maxstr);/*输入待分析的字符串*/output_process(table,str,gra,maxstr);/*输出分析过程*/strcpy_s(str,);cout\n\nDoyouwanttotryagain????(enter1:YESand0:NO)endl;cinagain;}system(pause);return0;}7intinput_vn(charVn[]){coutPleaseinputTheVn:;inti=0;while(Vn[i-1]!='#')/*输入Vn*/{cinVn[i];++i;}return0;}intinput_vt(charVt[]){coutPleaseinputTheVt:;inti=0;while(Vt[i-1]!='#')/*输入Vn*/{cinVt[i];++i;}return0;}intinput_grammer(_grammergra[]){coutPleaseinputTheGrammer:endupwith##endl;cout****VnandproductionisseparatedbySpaces*****endl;inti=0;while(gra[i-1].left!='#'){cingra[i].leftgra[i].right;++i;}return0;}intoutput_grammer(_grammergra[]){coutThegrammeris:endl;8inti=0;while(gra[i].left!='#'){cout\t\t\t\ti+1.gra[i].left---gra[i].rightendl;++i;}return0;}/*intget_maxgra(_grammergra[]){inti=0;while(gra[i].left!='#'){++i;}returni;}*/intinput_table(_tabletable[][M],intmaxvn,intmaxvt){inti=0,j=0,k=0,num=0;k=maxvn+maxvt+2;cout\nPleaseinputthenumberofstate:;cinnum;/*总的状态数*/while(i=num){j=0;while(jk)/*输入第i行*/{cintable[i][j].actiontable[i][j].go_to;++j;}++i;}return0;}intoutput_table(_tabletable[][M],intmaxvn,intmaxvt){coutendlendl;cout\t\t\t\n\nthisistheSLR(1)analysetable(=and0meansNULL):endl;9inti=0,j=0,k=0;k=maxvn+maxvt+2;while(table[i][0].go_to!=NULL||i==1||i==0){j=0;while(jk)/*输入第i行*/{if(i==0){cout'\t'table[i][j].action;}else{if(j==0||jmaxvt){cout\ttable[i][j].go_to;}else{cout'\t'table[i][j].actiontable[i][j].go_to;}}++j;}++i;coutendl;}return0;}intget_str(charstr[],int&i){cout\npleaseinputthestringreadytobeanalysed:;i=0;cinstr;i=strlen(str);str[i]='#';i++;return0;10}intoutput_process(_tabletable[][M],charstr[],_grammergra[],intmaxstr)/*输出分析过程*/{inti=0,j=0,k=0,m=0,n=0;intnum=0;/*表示步骤*/intt=0;/*循环计数变量*/intnum1=0;/*记录一次归约符号数目*/cout\n\nTheanalysisprocessisasfollows:endl;cout\t步骤\t状态栈\t\t符号栈;cout\t\t当前输入符\t\t剩余输入串\t\t动作endl;intstate[M];/*状态栈*/charsymbol[M];/*符号栈*/state[0]=0,symbol[0]='#';m++,n++;/*mn指向状态栈上一个空*/while(str[i]!=NULL){j=0;/*j表示当前的输入符在table表中的列*/while(str[i]!=table[0][j].action){j++;}/*在表中找到str[i]*/k=state[m-1]+1;/*状态栈栈顶所在的列*//*输出移进归约处理前内容**********************/cout\tnum;t=0;cout\t;while(tm)/*输出状态栈*/{if(state[t]9){coutstate[t];}elsecoutstate[t];++t;11}t=0;cout\t;while(tn)/*输出符号栈*/{coutsymbol[t];++t;}cout\t\tstr[i];/*当前输入符*/cout\t\t;t=i+1;while(tmaxstr)/*剩余输入符*/{coutstr[t];t++;}/********处理前输出结束*****************//****下面开始移进归约接受错误的处理*****/if(i==0)/*判断第一步*/{if(table[1][j].action='s'){cout\t\t移进endl;state[m]=table[1][j].go_to;m++;symbol[n]=str[i];n++;i++;continue;}else{cout\n\nSorry!!Cannotidentify!!endl;gotoend;}}if(table[k][j].action=='s')/*移进操作*/{cout\t\t移进endl;12state[m]=table[k][j].go_to;m++;symbol[n]=str[i];n++;i++;/*移进一个i才加1*/}else{if(table[k][j].action=='r')/*归约的处理*/{cout\t\t归约endl;t=table[