为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

自下而上语法分析程序LR分析程序

2017-10-16 7页 doc 36KB 24阅读

用户头像

is_353097

暂无简介

举报
自下而上语法分析程序LR分析程序自下而上语法分析程序LR分析程序 #include #include void prin() { printf("\n"); printf("++++ + + + 自下而上语法分析程序/LR分析程序 + + + ++++\n"); printf("++++ + + + 仅供参考,版权◎fo0ol + + + ++++\n"); printf("++++ + + + 输入一以#结束的符号串(包括()+-*/): + + + ++++\n"); } char *action[12][6]={"S5#",NULL,...
自下而上语法分析程序LR分析程序
自下而上语法分析程序LR分析程序 #include #include void prin() { printf("\n"); printf("++++ + + + 自下而上语法分析程序/LR分析程序 + + + ++++\n"); printf("++++ + + + 仅供参考,版权◎fo0ol + + + ++++\n"); printf("++++ + + + 输入一以#结束的符号串(包括()+-*/): + + + ++++\n"); } char *action[12][6]={"S5#",NULL,NULL,"S4#",NULL,NULL, /*ACTION*/ NULL,"S6#",NULL,NULL,NULL,"acc", NULL,"r2#","S7#", NULL,"r2#","r2#", NULL,"r4#","r4#", NULL,"r4#","r4#", "S5#",NULL,NULL, "S4#",NULL,NULL, NULL,"r6#","r6#", NULL,"r6#","r6#", "S5#",NULL,NULL, "S4#",NULL,NULL, "S5#",NULL,NULL, "S4#",NULL,NULL, NULL,"S6#",NULL, NULL,"S11#",NULL, NULL,"r1#","S7#", NULL,"r1#","r1#", NULL,"r3#","r3#", NULL,"r3#","r3#", NULL,"r5#","r5#", NULL,"r5#","r5#"}; int goto1[12][3]={1,2,3, /*QOTO表*/ 0,0,0, 0,0,0, 0,0,0, 8,2,3, 0,0,0, 0,9,3, 0,0,10, 0,0,0, 0,0,0, 0,0,0, 0,0,0}; char vt[6]={'i','+','*','(',')','#'}; /*存放终结符*/ char vn[3]={'E','T','F'}; /*存放非终结符*/ char *LR[7]={"M->E#","E->E+T#","E->T#","T->T*F#","T->F#","F->(E)#","F->i#"};/*存放产生 式*/ int a[20];//数组a实现状态栈 char b[20],c[20],c1;//数组b实现符号栈,数组c存放输入的字符串 int top1,top2,top3,top,m,n; void main() { int g,h,i,j,k,l,p,y,z,count; char x,copy[20],copy1[20]; top1=0;top2=0;top3=0;top=0; a[0]=0;y=a[0];b[0]='#'; count=0;z=0; prin(); do{ scanf("%c",&c1); c[top3]=c1; //字符数组c[10]存放输入的字符串 top3=top3+1;//最后top3=5 }while(c1!='#'); //输出分析结果 printf("步骤\t状态栈\t\t符号栈\t\t输入串\t\tACTION\tGOTO\n"); do{ y=z;m=0;n=0; /*y,z指向状态栈栈顶*/ g=top;j=0;k=0; x=c[top]; //将输入符号赋给x count++; printf("%d\t",count);//输出步骤序号 while(m<=top1) { /*输出状态栈*/ //if(a[m]>=10) // printf("%d",a[m]); //else printf("%d",a[m]); m=m+1; } printf("\t\t"); while(n<=top2) { /*输出符号栈*/ printf("%c",b[n]); n=n+1; } printf("\t\t"); while(g<=top3) { /*输出输入串*/ printf("%c",c[g]); g=g+1; } printf("\t\t"); while(x!=vt[j]&&j<=5) //获取当前x对应j的值 j++; if(j==5&&x!=vt[j])//如果x不是终结符则报错 { printf("error\n"); return; } if(action[y][j]==NULL){//,,,, printf("error\n"); return; } else strcpy(copy,action[y][j]);// //////////////////////////////////////////////////////// if(copy[0]=='S') { /*处理移进*/ z=copy[1]-'0';//因为状态从0开始 top1=top1+1; top2=top2+1; a[top1]=z;//数组a实现状态栈 b[top2]=x;//数组b实现符号栈 top=top+1;//输入符号串数组c的顶 i=0; while(copy[i]!='#')//例 "S3#" 输出ACTION { printf("%c",copy[i]); i++; } printf("\n"); } //////////////////////////////////////////////////////// if(copy[0]=='r') { /*处理归约*/ i=0; while(copy[i]!='#')//例 "S3#" 输出ACTION { printf("%c",copy[i]); i++; } h=copy[1]-'0';//因为状态从0开始 strcpy(copy1,LR[h]); while(copy1[0]!=vn[k]) //获取当前k值 k++; l=strlen(LR[h])-4;/// top1=top1-l+1; top2=top2-l+1; y=a[top1-1]; p=goto1[y][k]; a[top1]=p; b[top2]=copy1[0]; z=p; printf("\t"); printf("%d\n",p); } }while(action[y][j]!="acc"); printf("acc\n"); }
/
本文档为【自下而上语法分析程序LR分析程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索