简单优先文法关系矩阵构造.docx
- 文档编号:7063375
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:21
- 大小:142.56KB
简单优先文法关系矩阵构造.docx
《简单优先文法关系矩阵构造.docx》由会员分享,可在线阅读,更多相关《简单优先文法关系矩阵构造.docx(21页珍藏版)》请在冰豆网上搜索。
简单优先文法关系矩阵构造
通达学院
专业课程设计II
题目:
简单优先文法关系矩阵构造
专业计算机通信
学生姓名
班级学号
指导教师
指导单位计算机学院计算机科学与技术系
日期2012.11.12-2012.11.23
教师评语
同学出勤率(满勤、较高、一般,较低),学习态度(端正、较端正、一般、较差),程序设计基础(好、较好、一般、较差),演示程序(已经、没有)达到了基本要求,算法设计(好、较好、一般),界面友好程度(好、较好、一般),答辩过程中回答问题(准确、较准确、错误率较高),撰写报告格式(规范、一般)、内容(丰满、简单)、表述(清晰、一般、不清楚),(圆满、较好、基本)完成了课题任务。
教师签名:
年月日
成绩评定
备注
简单优先文法关系矩阵构造
一、课题内容和要求
基本功能:
对任意输入的文法均可计算其文法符号的优先关系。
例如文法G[Z],一共有7个符号:
Z、M、L、a、b、(、),文法之间的关系(规则)如下:
Z∷=bMbM∷=(L|aL∷=Ma)
二、概要设计
1.字符串处理:
此模块要求能够从输入的字符串中提取出字符集,包括终结符和非终结符,建立对应的字符表。
2.矩阵的乘方:
此模块要求能够计算矩阵的乘方,细化后应包括有局真的乘法的子模块。
3.求解R,L,=关系模块。
1)R关系:
由语法语句定义可知”A:
:
=…|..”形式可知扫描每一句语句找出第四个字符,和“|”字符的下一个字符,同定义符构成R关系。
2)L关系:
由语法语句定义可知”A:
:
=…|..”形式可知扫描每一句语句找出最后一个字符,和“|”字符的前一个字符,同定义符构成L关系。
3)=关系:
例如”A:
:
=AS|Aa|b”可知只需从第四个字符开始依次查找,A=S,遇到“|”符号时扫描指针i向后移动两位。
4.矩阵的并(和)运算:
根据编译原理中简单文法的规则,需要求出L+关系,R+关系,L*关系,而此求解根据warshll算法的需要进行大量的乘方运算。
L+=(L)U(L^2)U(L^3)……U(L^n)
L*=(L^0)U(L^1)U(L^2)U(L^3)……U(L^n)
R+=(R)U(R^2)U(R^3)……U(R^n)
5.矩阵显示输出模块
6.流程图
三、详细设计
#include
#include
#include
inthasletter(char*v,charc)//判断字符表中是否含有某一字符
{
intmark=0;
intlength=strlen(v);
for(inti=0;i { if(c==v[i]) { mark=1;//mark=1字符表v中含有c break; } } returnmark; } voidsearchstring(char*v,char**pMatrix,intn)//建立字符表 { inti,k,p; char*Vletter=newchar[257]; Vletter[256]='\0';; for(i=0;i<256;i++) { Vletter[i]='\0'; } for(i=0,k=0,p=0;i { for(intj=0;j { if(! hasletter(v,pMatrix[i][j])) { if((pMatrix[i][j]<='Z')&&(pMatrix[i][j]>='A')) { v[k++]=pMatrix[i][j]; } elseif(! hasletter(Vletter,pMatrix[i][j])) { if(((pMatrix[i][j]<'A')||(pMatrix[i][j]>'Z'))&&(pMatrix[i][j]! =': '&&pMatrix[i][j]! ='='&&pMatrix[i][j]! ='|')) { Vletter[p++]=pMatrix[i][j]; } } } } } intvl=strlen(v); intVletterl=strlen(Vletter); for(i=vl,k=0;k { v[i]=Vletter[k]; } } /*******矩阵乘法******/ voidMatrix_mutiply(int**Matrix_1,int**Matrix_2,int**Matrix_Resutl,intn) { intlength=n; inttemp=0; for(introw=0;row { for(intcolumn=0;column { for(intm=0;m { Matrix_Resutl[row][column]+=Matrix_1[row][m]*Matrix_2[m][column]; if(Matrix_Resutl[row][column]! =0) { Matrix_Resutl[row][column]=1; } } } } } /*******矩阵输出显示******/ voidmatrixprint(int**ma,intlength)//矩阵的输出显示 { intmark=0; for(inti=0;i { for(intj=0;j { mark++; if(mark { printf("%d",ma[i][j]); } else { printf("%d\n",ma[i][j]); mark=0; } } } printf("\n\n"); } voidmatrixprintchar(char**ma,intlength,char*v)//矩阵的输出为>=<号 { intmark=0; printf(""); for(intk=0;k { printf("%c",v[k]); } printf("\n"); for(inti=0;i { printf("%c",v[i]); for(intj=0;j { mark++; if(mark { printf("%c",ma[i][j]); } else { printf("%c\n",ma[i][j]); mark=0; } } } printf("\n\n"); } /*******矩阵的转置******/ voidmatrixTravers(int**Matrix_1,int**matrixTravers,intn)//矩阵的转置 { inttemp=0; for(inti=0;i { for(intj=i+1;j { temp=Matrix_1[i][j]; Matrix_1[i][j]=Matrix_1[j][i]; Matrix_1[j][i]=temp; } } for(intk=0;k { for(intm=0;m { matrixTravers[k][m]=Matrix_1[k][m]; } } } /*******显示最后的优先关系矩阵******/ voidshowresult(int**BE_Matrix,int**BL_Matix,int**BB_Matrix,char**result_Matrix,intn)//合成最后的矩阵 { for(inti=0;i { for(intj=0;j { if(! ((BE_Matrix[i][j]==0)&&(BL_Matix[i][j]==0)&&(BB_Matrix[i][j]==0))) { if(BE_Matrix[i][j]==1) { result_Matrix[i][j]='='; continue; } elseif(BB_Matrix[i][j]==1) { result_Matrix[i][j]='>'; continue; } elseif(BL_Matix[i][j]==1) { result_Matrix[i][j]='<'; } } } } } voidcalcBLT(int**BE,int**BLPlus,int**BLLessThan,intn)//计算<=矩阵 { Matrix_mutiply(BE,BLPlus,BLLessThan,n); } voidcalcBBT(int**Matrix_1,int**Matrix_2,int**Matrix_Resutl,int**Matrix_BigT,intn)//计算>=关系 { int**Matrix_temp=newint*[n]; for(inti=0;i Matrix_temp[i]=newint[n]; for(i=0;i { for(intj=0;j { Matrix_temp[i][j]=0; } } /* for(i=0;i { for(intj=0;j { Matrix_BigT[j][i]=0; } } */ /***********修正使所有的非终结符对应的列置零******************/ Matrix_mutiply(Matrix_1,Matrix_2,Matrix_temp,n); Matrix_mutiply(Matrix_temp,Matrix_Resutl,Matrix_BigT,n); //matrixprint(Matrix_BigT,n); } voidinitialMatirx(int**Matrix,intn) { for(inti=0;i { for(intj=0;j { Matrix[i][j]=0; } } } intfindletterindex(char*a,charc) { inti=0; for(;a[i]! =c;i++); returni; } voidunionMatrix(int**Matrix,int**Matrix1,int**MatrixR,intn)//矩阵的的并集 { for(inti=0;i { for(intj=0;j { if(Matrix[i][j]+Matrix1[i][j]! =0) { MatrixR[i][j]=1; } } } } voidwashall(int**unitMatrix,int**Matrix,int**MatrixTemp,int**MatrixR,intn,intmark)//mark=1表示求L+,R+,mark=表示求L* { initialMatirx(MatrixTemp,n); initialMatirx(MatrixR,n); unionMatrix(MatrixTemp,Matrix,MatrixR,n); unionMatrix(MatrixTemp,Matrix,MatrixTemp,n); for(inti=2;i { Matrix_mutiply(MatrixTemp,Matrix,MatrixTemp,n);//计算矩阵的i次方 unionMatrix(MatrixTemp,MatrixR,MatrixR,n); } if(! (mark==1)) { unionMatrix(MatrixR,unitMatrix,MatrixR,n); } } /*************计算R关系********************/ voidcalcR(char**a,char*v,int**matrixR,intstringcolum)//计算R关系 { for(intk=0;k { intmarkrow=findletterindex(v,a[k][0]);//找到每句文法最右边的非终极符 for(intn=4;n { intmarkcol; if(a[k][n]=='|') { markcol=findletterindex(v,a[k][n-1]); matrixR[markrow][markcol]=1; } if(n+1==strlen(a[k])) { markcol=findletterindex(v,a[k][n]); matrixR[markrow][markcol]=1; } } } } /*************计算L关系********************/ voidcalcL(char**a,char*v,int**matrixR,intstringcolum)//计算L关系 { for(intk=0;k { intmarkrow=findletterindex(v,a[k][0]);//找到每句文法最左边的非终极符 intmarkcol=findletterindex(v,a[k][4]); matrixR[markrow][markcol]=1; for(intn=4;n { intmarkcol; if(a[k][n]=='|') { markcol=findletterindex(v,a[k][n+1]); matrixR[markrow][markcol]=1; } } } } /*************计算=关系********************/ voidcalcE(char**a,char*v,int**matrixR,intstringcolum)//计算=关系 { for(intk=0;k { //找到每句文法=关系的非终极符 for(intp=4;p { if((a[k][p]! ='|')&&(a[k][p+1]! ='|')) { intmarkrow=findletterindex(v,a[k][p]); intmarkcol=findletterindex(v,a[k][p+1]); matrixR[markrow][markcol]=1; } } } } /*******主函数******/ voidmain() { intn,k,p; intstringcolum; printf("请输入语句数目\n"); scanf("%d",&n); stringcolum=n;//语句数目 char**pMatrix=newchar*[n]; for(inti=0;i { pMatrix[i]=newchar[n]; scanf("%s",pMatrix[i]); } char*v=newchar[257]; v[256]='\0'; for(i=0;i<256;i++) { v[i]='\0'; } searchstring(v,pMatrix,n); printf("vocabulary: %s\n",v); n=strlen(v); int**unitMatrix=newint*[n]; int**BL=newint*[n]; int**BR=newint*[n]; int**BE=newint*[n]; int**BLPlus=newint*[n]; int**BRPlus=newint*[n]; int**BLLessThan=newint*[n]; int**BRPlusTrav=newint*[n]; int**BLM=newint*[n]; int**BBigT=newint*[n]; int**matrixtemp=newint*[n]; char**result_Matrix=newchar*[n]; for(i=0;i { unitMatrix[i]=newint[n]; BL[i]=newint[n]; BR[i]=newint[n]; BE[i]=newint[n]; BLPlus[i]=newint[n]; BRPlus[i]=newint[n]; BLLessThan[i]=newint[n]; BRPlusTrav[i]=newint[n]; BLM[i]=newint[n]; BBigT[i]=newint[n]; matrixtemp[i]=newint[n]; result_Matrix[i]=newchar[n]; } for(i=0;i { for(intj=0;j { result_Matrix[i][j]=2; } } initialMatirx(BL,n); initialMatirx(BR,n); initialMatirx(BLPlus,n); initialMatirx(BE,n); initialMatirx(BLM,n); initialMatirx(BLLessThan,n); initialMatirx(BBigT,n); initialMatirx(BRPlusTrav,n); initialMatirx(unitMatrix,n); for(i=0;i { unitMatrix[i][i]=1;//初始化单位矩阵 } calcR(pMatrix,v,BR,stringcolum); printf("R关系如下: \n"); matrixprint(BR,n); calcL(pMatrix,v,BL,stringcolum); printf("L关系如下: \n"); matrixprint(BL,n); calcE(pMatrix,v,BE,stringcolum); printf("=关系如下: \n"); matrixprint(BE,n); washall(unitMatrix,BR,matrixtemp,BRPlus,n,1); printf("R+关系如下: \n"); matrixprint(BRPlus,n); matrixTravers(BRPlus,BRPlusTrav,n); printf("(R+)T关系如下: \n"); matrixprint(BRPlusTrav,n); washall(unitMatrix,BL,matrixtemp,BLM,n,0); printf("L*关系如下: \n"); matrixprint(BLM,n); washall(unitMatrix,BL,matrixtemp,BLPlus,n,1); printf("L+关系如下: \n"); matrixprint(BLPlus,n); calcBLT(BE,BLPlus,BLLessThan,n); printf("<=关系如下: \n"); matrixprint(BLLessThan,n); calcBBT(BRPlusTrav,BE,BLM,BBigT,n); printf(">=关系如下: \n"); matrixprint(BBigT,n); intnletter=0;//记录V中的非终结符的数目 for(i=0;i { if(v[i]>='A'&&v[i]<='Z') { nletter++; } } for(i=0;i { for(intj=0;j { BBigT[j][i]=0; } } printf("修正后的>=关系\n");//简单文法最终的>关系要求将非终结符对应的列全部置零 matrixprint(BBigT,n); printf("单位矩阵\n"); matrixprint(unitMatrix,n); showresult(BE,BLLessThan,BBigT,result_Matrix,n); matrixprintchar(result_Matrix,n,v); } 四、测试数据及其结果分析 五、课程设计总结 这个课程设计题目设计编译原理知识,所以一开始拿到题目后,对编译原理又学习了一遍,弄懂了以后发现这个程序对矩阵的用法很多,而我对C语言不擅长,所以经过图书馆里查找资料,学习以后才解决,在调试过程中经常出现字符串错误,对字符串的运用不恰当,还有字符串的初始化
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 优先 文法 关系 矩阵 构造