自下而上语法分析程序LR分析程序自下而上语法分析程序LR分析程序
#include
#include
void prin()
{ printf("\n");
printf("++++ + + + 自下而上语法分析程序/LR分析程序 + + + ++++\n");
printf("++++ + + + 仅供参考,版权◎fo0ol + + + ++++\n");
printf("++++ + + + 输入一以#结束的符号串(包括()+-*/): + + + ++++\n");
}
char *action[12][6]={"S5#",NULL,...
自下而上语法分析程序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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。