简单优先文法关系矩阵构造
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通达学院
专业课程设计II 题目:简单优先文法关系矩阵构造
专业计算机通信
学生姓名
班级学号
指导教师
指导单位计算机学院计算机科学与技术系日期2012.11.12-2012.11.23
教师评语
同学出勤率(满勤、较高、一般,较低),学习态度(端正、较端正、一般、较差),程序设计基础(好、较好、一般、较差),演示程序(已经、没有)达到了基本要求,算法设计(好、较好、一般),界面友好程度(好、较好、一般),答辩过程中回答问题(准确、较准确、错误率较高),撰写报告格式(规范、一般)、内容(丰满、简单)、表述(清晰、一般、不清楚),(圆满、较好、基本)完成了课题任务。
教师签名:
年月日
成绩评定
备注
简单优先文法关系矩阵构造
一、课题内容和要求
基本功能:对任意输入的文法均可计算其文法符号的优先关系。
例如文法G[Z],一共有7个符号:Z、M、L、a、b、(、),文法之间的关系(规则)如下:Z ∷=bMb M ∷=(L|a L∷=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.流程图
Start
输入语法语句
搜索终结符及非终
结符
建立字符集V
建立各种矩阵并初
始化
完成矩阵的初始化
计算R关系计算L关系计算=关系
计算出三种关系
计算L+计算R+计算L*根据公式计算出>、
<关系
合成最后输出矩阵
输出显示各矩阵
三、详细设计
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hasletter(char *v,char c) //判断字符表中是否含有某一字符
{
int mark=0;
int length=strlen(v);
for (int i=0;i<length;i++)
{
if (c==v[i])
{
mark=1; //mark=1 字符表v中含有c
break;
}
}
return mark;
}
void searchstring(char *v,char **pMatrix,int n) //建立字符表
{
int i,k,p;
char *Vletter =new char[257];
Vletter[256]='\0';;
for (i=0;i<256;i++)
{
Vletter[i]='\0';
}
for (i=0,k=0,p=0;i<n;i++)
{
for (int j=0;j<strlen(pMatrix[i]);j++)
{
if (!hasletter(v,pMatrix[i][j]))
{
if ((pMatrix[i][j]<='Z')&&(pMatrix[i][j]>='A'))
{
v[k++]=pMatrix[i][j];
}
else if (!hasletter(Vletter,pMatrix[i][j]))
{
if
(((pMatrix[i][j]<'A')||(pMatrix[i][j]>'Z'))&&(pMatrix[i][j]!=':'&&pMatrix[i][j]!='='&&pMatrix[i][j]!='|'))
{
}
}
}
}
}
int vl=strlen(v);
int Vletterl=strlen(Vletter);
for (i=vl,k=0;k<Vletterl;i++,k++)
{
v[i]=Vletter[k];
}
}
/*******矩阵乘法******/
void Matrix_mutiply(int **Matrix_1, int **Matrix_2,int **Matrix_Resutl, int n)
{
int length=n;
int temp=0;
for (int row=0;row<length;row++)
{
for(int column=0;column<length;column++)
{
for(int m=0;m<length;m++)
{
Matrix_Resutl[row][column]+=Matrix_1[row][m]*Matrix_2[m][column];
if (Matrix_Resutl[row][column]!=0)
{
Matrix_Resutl[row][column]=1;
}
}
}
}
}
/*******矩阵输出显示******/
void matrixprint(int **ma,int length) //矩阵的输出显示
{
int mark=0;
for (int i=0 ;i<length;i++)
{
for(int j=0;j<length;j++)
{
mark++;
if (mark<length)
printf(" %d ",ma[i][j]);
}
else
{
printf(" %d \n",ma[i][j]);
mark=0;
}
}
}
printf("\n \n");
}
void matrixprintchar(char **ma,int length,char *v) //矩阵的输出为> = <号{
int mark=0;
printf(" ");
for (int k=0;k<length;k++)
{
printf(" %c ",v[k]);
}
printf("\n");
for (int i=0 ;i<length;i++)
{
printf(" %c ",v[i]);
for(int j=0;j<length;j++)
{
mark++;
if (mark<length)
{
printf(" %c ",ma[i][j]);
}
else
{
printf(" %c \n",ma[i][j]);
mark=0;
}
}
}
printf("\n \n");
}
/*******矩阵的转置******/
void matrixTravers(int **Matrix_1,int **matrixTravers,int n) //矩阵的转置
int temp=0;
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
{
temp=Matrix_1[i][j];
Matrix_1[i][j]=Matrix_1[j][i];
Matrix_1[j][i]=temp;
}
}
for (int k=0;k<n;k++)
{
for (int m=0;m<n;m++)
{
matrixTravers[k][m]=Matrix_1[k][m];
}
}
}
/*******显示最后的优先关系矩阵******/
void showresult(int **BE_Matrix,int **BL_Matix,int **BB_Matrix,char **result_Matrix,int n) //合成最后的矩阵
{
for (int i=0;i<n;i++)
{
for (int j=0;j<n;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;
}
else if (BB_Matrix[i][j]==1)
{
result_Matrix[i][j]='>';
continue;
}
else if (BL_Matix[i][j]==1)
{
result_Matrix[i][j]='<';
}
}
}
void calcBLT(int **BE, int **BLPlus,int **BLLessThan,int n) //计算<=矩阵
{
Matrix_mutiply(BE,BLPlus,BLLessThan,n);
}
void calcBBT(int **Matrix_1, int **Matrix_2,int **Matrix_Resutl,int **Matrix_BigT, int n) //计算>=关系
{
int **Matrix_temp=new int*[n];
for (int i = 0; i < n; i++)
Matrix_temp[i] = new int[n];
for (i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
Matrix_temp[i][j]=0;
}
}
/*
for (i=0;i<nletterlengh)
{
for (int j=0;j<n;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);
}
void initialMatirx(int **Matrix,int n)
{
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
Matrix[i][j]=0;
}
int findletterindex(char *a,char c)
{
int i=0;
for (;a[i]!=c;i++);
return i;
}
void unionMatrix(int **Matrix,int **Matrix1,int **MatrixR,int n) //矩阵的的并集
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(Matrix[i][j]+Matrix1[i][j]!=0)
{
MatrixR[i][j]=1;
}
}
}
}
void washall(int **unitMatrix,int **Matrix,int **MatrixTemp,int **MatrixR,int n,int mark) //mark=1表示求L+,R+,mark=表示求L*
{
initialMatirx(MatrixTemp,n);
initialMatirx(MatrixR,n);
unionMatrix(MatrixTemp,Matrix,MatrixR,n);
unionMatrix(MatrixTemp,Matrix,MatrixTemp,n);
for(int i=2;i<n;i++)
{
Matrix_mutiply(MatrixTemp,Matrix,MatrixTemp,n); //计算矩阵的i次方
unionMatrix(MatrixTemp,MatrixR,MatrixR,n);
}
if (!(mark==1))
{
unionMatrix(MatrixR,unitMatrix,MatrixR,n);
}
}
/*************计算R关系********************/
void calcR(char **a,char *v,int **matrixR,int stringcolum) //计算R关系
{
int markrow =findletterindex(v,a[k][0]); //找到每句文法最右边的非终极符
for (int n=4;n<strlen(a[k]);n++)
{
int markcol;
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关系********************/
void calcL(char **a,char *v,int **matrixR,int stringcolum) //计算L关系
{
for (int k=0;k<stringcolum;k++)
{
int markrow =findletterindex(v,a[k][0]); //找到每句文法最左边的非终极符int markcol =findletterindex(v,a[k][4]);
matrixR[markrow][markcol]=1;
for (int n=4;n<strlen(a[k]);n++)
{
int markcol;
if (a[k][n]=='|')
{
markcol=findletterindex(v,a[k][n+1]);
matrixR[markrow][markcol]=1;
}
}
}
}
/*************计算=关系********************/
void calcE(char **a,char *v,int **matrixR,int stringcolum) //计算=关系
{
for (int k=0;k<stringcolum;k++)
//找到每句文法=关系的非终极符for (int p=4;p<strlen(a[k])-1;p++)
{
if ((a[k][p]!='|')&&(a[k][p+1]!='|'))
{
int markrow=findletterindex(v,a[k][p]);
int markcol=findletterindex(v,a[k][p+1]);
matrixR[markrow][markcol]=1;
}
}
}
}
/*******主函数******/
void main()
{
int n,k,p;
int stringcolum;
printf("请输入语句数目\n");
scanf("%d",&n);
stringcolum=n; //语句数目
char **pMatrix = new char*[n];
for (int i = 0; i < n; i++)
{
pMatrix[i] = new char[n];
scanf("%s",pMatrix[i]);
}
char *v=new char[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=new int*[n];
int **BL=new int*[n];
int **BR=new int*[n];
int **BE=new int*[n];
int **BLPlus=new int*[n];
int **BRPlus=new int*[n];
int **BLLessThan=new int*[n];
int **BRPlusTrav=new int*[n];
int **BLM=new int*[n];
int **BBigT=new int*[n];
int **matrixtemp=new int*[n];
char **result_Matrix=new char*[n];
for (i = 0; i < n; i++)
{
unitMatrix[i] = new int[n];
BL[i] = new int[n];
BR[i] = new int[n];
BE[i] = new int[n];
BLPlus[i] = new int[n];
BRPlus[i] = new int[n];
BLLessThan[i] = new int[n];
BRPlusTrav[i] = new int[n];
BLM[i] = new int[n];
BBigT[i] = new int[n];
matrixtemp[i]=new int[n];
result_Matrix[i] = new char[n];
}
for (i=0;i<n;i++)
{
for (int j=0;j<n;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<n;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);
int nletter=0; //记录V中的非终结符的数目
for (i=0;i<n;i++)
{
if (v[i]>='A'&&v[i]<='Z')
{
nletter++;
}
}
for (i=0;i<nletter;i++) //修正>=关系
{
for (int j=0;j<n;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语言不擅长,所以经过图书馆里查找资料,学习以后才解决,在调试过程中经常出现字符串错误,对字符串的运用不恰当,还有字符串的初始化也出现了很多问题,后来通过不断的学习,修改,调试终于成功了。
在这次课程设计中,最大的收获是发现错误后想尽一切办法去解决,不管做什么事
我们都会遇到很多挫折,困难,面对困难,挫折不是去抱怨,沮丧,更重要的是如何去解决,只要你往前就一定会有办法找到出路,而你停止不动就永远找不到出口,马上就面临毕业的我们,在今后的人生道路上肯定会有更多的困难险阻,但我们一定不能退缩,只有这样我们才会成功。