编译原理实验算符优先分析.docx
- 文档编号:10307791
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:18
- 大小:74.51KB
编译原理实验算符优先分析.docx
《编译原理实验算符优先分析.docx》由会员分享,可在线阅读,更多相关《编译原理实验算符优先分析.docx(18页珍藏版)》请在冰豆网上搜索。
编译原理实验算符优先分析
代码:
#include
#include
#include
#include
#include
usingnamespacestd;
charstr1[50][50];//存放优先表
structcsc{//用结构体数组来存放产生式
charLeft;//存放产生式的左部
charRight[100];//存放产生式的右部
}G[100];
structdb{
charVN;//用于存放FIRSTVT(P)和LASTVT(P)的非终结符
charVtoT[100];//用于存放FIRSTVT(P)和LASTVT(P)的终结符
}firstvt[100],lastvt[100];
intCapital(charch)//判断是否是非终结符,默认大写字母为非终结符,其他为终结符
{
if(ch>='A'&&ch<='Z')
return1;
else
return0;
}
voidIssfwf(cscG[],intlength)//判断文法是否为算符文法
{
inti,j;
intflag=0;
for(i=0;i { for(j=0;j if(Capital(G[i].Right[j])==1&&Capital(G[i].Right[j+1])==1) { flag=1; break; } } if(flag==1) { cout<<"该文法不是算符文法! "< return; } else cout<<"该文法是算符文法! "< } voidClean(dbVNT[],intlength1)//去掉集合中重复部分 { charstr1[20]; charstr2[20][100]; inti,j,k,t; intlength; intflag; for(i=0;i { str1[i]=VNT[i].VN; strcpy(str2[i],VNT[i].VtoT); } for(i=0;i memset(VNT[i].VtoT,0,sizeof(VNT[i].VtoT)); for(i=0;i { t=0; length=strlen(str2[i]); for(j=0;j { flag=1; for(k=0;k if(VNT[i].VtoT[k]==str2[i][j]) flag=0; if(flag==1) VNT[i].VtoT[t++]=str2[i][j]; } length=strlen(VNT[i].VtoT); } } voidFIRSTVT(cscG[],dbfirstvt[],intlength)//求各非终结符的FIRSTVT集合 { intflag=0,length1=0; inti,j,k; for(i=0;i<100;i++) memset(firstvt[i].VtoT,0,sizeof(firstvt[i].VtoT)); while(flag { j=0; firstvt[length1].VN=G[flag].Left; while(firstvt[length1].VN==G[flag].Left) { if(Capital(G[flag].Right[0])==0)//P->a...则将a加入firstvt(P)中 firstvt[length1].VtoT[j++]=G[flag].Right[0]; elseif(Capital(G[flag].Right[0])==1&&Capital(G[flag].Right[1])==0)//P->Qa...则将a加入firstvt(P)中 firstvt[length1].VtoT[j++]=G[flag].Right[1]; flag++; } length1++; } for(i=length-1;i>=0;i--)//P->Q...,则将Q中的终结符加入P中 if(Capital(G[i].Right[0])==1&&G[i].Left! =G[i].Right[0]) { for(j=0;j if(firstvt[j].VN==G[i].Right[0]) break; for(k=0;k if(firstvt[k].VN==G[i].Left) break; strcat(firstvt[k].VtoT,firstvt[j].VtoT); } Clean(firstvt,length1); for(i=0;i { cout<<"FIRSTVT("; cout< cout< for(j=1;j cout<<","< cout<<"}"< } } voidLASTVT(cscG[],dblastvt[],intlength)//求各非终结符的FIRSTVT集合 { intflag=0,length1=0; inti,j,k,t; for(i=0;i<100;i++) memset(lastvt[i].VtoT,0,sizeof(lastvt[i].VtoT)); while(flag { j=0; lastvt[length1].VN=G[flag].Left; while(lastvt[length1].VN==G[flag].Left) { t=strlen(G[flag].Right)-1; if(Capital(G[flag].Right[t])==0)//P->...a则将a加入lastvt(P)中 lastvt[length1].VtoT[j++]=G[flag].Right[t]; elseif(Capital(G[flag].Right[t])==1&&Capital(G[flag].Right[t-1])==0)//P->...aQ则将a加入lastvt(P)中 lastvt[length1].VtoT[j++]=G[flag].Right[t-1]; flag++; } length1++; } for(i=length-1;i>=0;i--)//P->...Q,则将Q中的终结符加入P中 { t=strlen(G[flag].Right)-1; if(Capital(G[i].Right[t])==1&&G[i].Left! =G[i].Right[t]) { for(j=0;j if(lastvt[j].VN==G[i].Right[t]) break; for(k=0;k if(lastvt[k].VN==G[i].Left) break; strcat(lastvt[k].VtoT,lastvt[j].VtoT); } } Clean(lastvt,length1); for(i=0;i { cout<<"LASTVT("; cout< cout< for(j=1;j cout<<","< cout<<"}"< } } voidStructureTable(cscG[],dbfirstvt[],dblastvt[],intlength)//返回非终结符个数 { charstr[50];//存放终结符 inti,j,k,flag,i1,i2,length1; intt=0; for(i=0;i<50;i++) memset(str1[i],0,sizeof(str1[i])); memset(str,0,sizeof(str)); for(i=0;i { j=strlen(G[i].Right); flag=1; for(k=0;k if(Capital(G[i].Right[k])==0) { for(i1=0;i1 if(G[i].Right[k]==str[i1]) flag=0; if(flag==1) str[t++]=G[i].Right[k]; } } for(i=0;i if(str[i]=='#') break; swap(str[i],str[strlen(str)-1]); for(i=1;i<=strlen(str);i++) { str1[0][i]=str[i-1]; str1[i][0]=str[i-1]; } for(i=0;i { length1=strlen(G[i].Right); for(j=0;j { if(Capital(G[i].Right[j])==0&&Capital(G[i].Right[j+1])==0) { for(i1=0;i1<=strlen(str);i1++) for(i2=0;i2<=strlen(str);i2++) if(str1[0][i1]==G[i].Right[j]&&str1[i2][0]==G[i].Right[j+1]) { if(str1[i1][i2]! =0) { cout<<"该文法不是算符优先文法! "< return; } else str1[i1][i2]='='; } } if(j { for(i1=0;i1<=strlen(str);i1++) for(i2=0;i2<=strlen(str);i2++) if(str1[0][i1]==G[i].Right[j]&&str1[i2][0]==G[i].Right[j+2]) { if(str1[i1][i2]! =0) { cout<<"该文法不是算符优先文法! "< return; } else str1[i1][i2]='='; } } if(Capital(G[i].Right[j])==0&&Capital(G[i].Right[j+1])==1) { for(i1=0;str1[0][i1]! =G[i].Right[j];i1++); for(k=0;firstvt[k].VN! =G[i].Right[j+1];k++); for(i2=0;i2<=strlen(str);i2++) for(t=0;t if(str1[i2][0]==firstvt[k].VtoT[t]) { if(str1[i1][i2]! =0) { cout<<"该文法不是算符优先文法! "< return; } else str1[i1][i2]='<'; } } if(Capital(G[i].Right[j])==1&&Capital(G[i].Right[j+1])==0) { for(t=0;lastvt[t].VN! =G[i].Right[j];t++); for(k=0;k for(i1=0;i1<=strlen(str);i1++) for(i2=0;i2<=strlen(str);i2++) if(str1[0][i1]==lastvt[t].VtoT[k]&&str1[i2][0]==G[i].Right[j+1]) { if(str1[i1][i2]! =0) { cout<<"该文法不是算符优先文法! "< return; } else str1[i1][i2]='>'; } } } } for(i=0;i<=strlen(str);i++) { for(j=0;j<=strlen(str);j++) cout< cout< } } charGetRalation(chara,charb)//找到a,b对应的关系 { inti,j; for(i=0;str1[0][i]! =a;i++); for(j=0;str1[j][0]! =b;j++); returnstr1[i][j]; } voidJudge(char*str,cscG[]) { charQ; chara; charstr2[100]; charS[100]; intflag=0; inti=0; intj,k; ints=0,step=1; intlength; cout.width(5);//输出表头 cout.setf(ios: : left); cout<<"步骤"; cout.width(15); cout.setf(ios: : left); cout<<"符号栈"; cout.width(15); cout.setf(ios: : left); cout<<"输入串"; cout.width(15); cout.setf(ios: : left); cout<<"动作"< memset(S,0,sizeof(S)); a=str[0]; k=1; S[k]='#'; while(a! ='#') { a=str[flag++]; if(Capital(S[k])==0) j=k; else j=k-1; while(GetRalation(S[j],a)=='>') { Q=S[j]; while(GetRalation(S[j],Q)! ='<') { Q=S[j]; if(Capital(S[j-1])==0) j=j-1; else j=j-2; } cout.width(5); cout.setf(ios: : left); cout< cout.width(15); cout< cout.width(15); cout.setf(ios: : left); cout< cout.width(15); cout.setf(ios: : left); cout<<"规约"< for(i=j+2;i<=k;i++) S[i]=0; k=j+1; S[k]='N'; } if(GetRalation(S[j],a)=='<'||GetRalation(S[j],a)=='=') { cout.width(5); cout.setf(ios: : left); cout< cout.width(15); cout< cout.width(15); //cout.setf(ios: : right); cout< if(a! ='#') { cout.width(15); cout.setf(ios: : left); cout<<"移进"< } k=k+1; S[k]=a; } else { cout<<"抱歉,输入的句子有误"< return; } } cout<<"接受"< cout<<"恭喜你! 分析成功! "< } voidmain() { charstr3[100];//用于存放一个产生式子 charstr2[100];//用于存放待检测的字符串 charfilename[10];//文件名 intlength=0;//记录产生式个数 ints=0; cout<<"请输入文件名: "; cin>>filename; memset(str1,0,sizeof(str1));//置空字符串 ifstreamfin1(filename); if(! fin1) { cout<<"Cannotopenthefile.\n";//未找到对应文件名的文件 exit (1); } while(fin1) { fin1.getline(str3,100);//读出一个产生式 cout< G[length].Left=str3[0];//产生式的左部 strcpy(G[length].Right,str3+3); length++; } length-=1; Issfwf(G,length); cout<<"各非终结符的FIRSTVT集合如下: "< FIRSTVT(G,firstvt,length); cout<<"各非终结符的LASTVT集合如下: "< LASTVT(G,lastvt,length); cout<<"构造分析表如下: "< StructureTable(G,firstvt,lastvt,length); cout<<"请任意输入一个输入串(以#号键结束): "< cin>>str2; Judge(str2,G); } 调试文件内容: Z->#E# E->E+T E->T T->T*F T->F F->P^F F->P P->(E) P->i 结果截图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 优先 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)