




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本程序是使用C语言在TC2.0的环境下编写的编译原理中算符优先表的构造,供大家参考之用,切勿直接抄袭。程序正确无误,若环境不同,则有可能发生错误,请确保编译环境为TC2.0。要正确的运行本程序还需要将本文档最后的产生式存入chanshen.txt中。程序亦有很多可以改进的地方,若有更好的方法,可以发信息给我,交流之用。/*题目:构造优先表作者:Jolor(2008118228)创建时间:2011年4月19日*/#include #include #include #define MAX 20#define NULL 0#define TRUE 1#define FALSE 0/*程序中所用到的结构体和变量*/struct no_sign /*非终结符的结构体*/char big_char; /*非终结符*/char firstvtMAX; /*非终结符的FIRSTVT集合*/char lastvtMAX; /*非终结符的LASTVT集合*/;struct sign /*终结符的结构体*/char small_char; /*终结符*/;typedef struct chanshengshi /*产生式的结构体*/char left; /*产生式的左部*/char rightMAX; /*产生式的右部*/chanshengshi;struct candidate /*候选式结构体*/char candidateMAX; /*候选式串*/;/*程序中所用到的变量*/int no_sign_num=0; /*非终结符的数目*/int sign_num=0; /*终结符的数目*/int chanshengshi_num=0; /*产生式的数目*/int candidate_num=0; /*候选式的数目*/int FMAXMAX; /*布尔数组F,行列为终结符号的数目*/int LMAXMAX; /*布尔数组L,行列为终结符号的数目*/char start_sign; /*开始符号*/struct chanshengshi formularMAX; /*产生式的集合*/struct no_sign no_terminalMAX; /*非终结符的集合*/struct sign terminalMAX; /*终结符的集合*/struct candidate candiMAX; /*候选式的结合*/*初始化函数*/void init()/*分析文件中的产生式函数*/void analysis(FILE *fp)int i,j; /*循环变量*/char sign; /*暂存一个字符*/char tempMAX; /*存放字符串的临时数组*/chanshengshi *p; /*产生式指针*/sign=fgetc(fp);start_sign=sign; /*读取的第一个字符为开始符号*/rewind(fp); /*文件指针重新回到文件开始位置*/while(fscanf(fp,%s,temp)!=-1) /*扫描文件,为产生式集合赋值*/formularchanshengshi_num.left=temp0;strcpy(formularchanshengshi_num.right,temp+3);chanshengshi_num+;/*printf(The number of chanshengshi: %d.n,chanshengshi_num);*/formularchanshengshi_num.left=NULL; /*将产生式集合中的第一个空元素赋值,作为扫描结束标志*/strcpy(formularchanshengshi_num.right,);for(p=formular;p-left!=NULL;p+)for(i=0;ileft=no_terminali.big_char)break;if(i=no_sign_num) /*将还没有在非终结符集合中非终结符加入集合*/no_terminalno_sign_num.big_char=p-left;strcpy(no_terminalno_sign_num.firstvt,);strcpy(no_terminalno_sign_num.lastvt,);no_sign_num+;for(i=0;p-righti!=NULL;i+) /*扫描产生式的右部,将终结符加入终结符的集合*/if(!(p-rightirighti=A) /*去除非终结符号*/for(j=0;jrighti=terminalj.small_char)break;if(j=sign_num) /*将不在终结符集合中的终结符加入结合*/terminalsign_num.small_char=p-righti;sign_num+;for(i=0;iright,candii.candidate)=0)break;if(i=candidate_num) /*将不在候选式集合中的候选式加入候选式集合*/strcpy(candicandidate_num.candidate,p-right);candidate_num+;no_terminalno_sign_num.big_char=NULL; /*为非终结符集合添加结束标志*/strcpy(no_terminalno_sign_num.firstvt,);strcpy(no_terminalno_sign_num.lastvt,);sign_num+;terminalsign_num.small_char=#; /*为终结符集合添加#标志*/sign_num+;terminalsign_num.small_char=NULL; /*为终结符集合添加结束标志,最终的数目会为所有的终结符号数目+2*/formularchanshengshi_num.left=NULL; /*为产生式集合添加结束标志*/strcpy(formularchanshengshi_num.right,);strcpy(candicandidate_num.candidate,); /*为候选式集合添加结束标志*/fclose(fp); /*关闭文件*/*显示关于产生式、非终结符、终结符的详细信息*/void show_chanshengshi()int i,j;printf(The start_sign: %cn,start_sign);printf(The number of no_terminal: %d.n,no_sign_num);printf(The number of terminal: %d.n,sign_num-2); printf(The number of chanshengshi: %d.n,chanshengshi_num);printf(The no_terminal are :n);for(i=0;ino_sign_num;i+)printf(%c ,no_terminali.big_char);printf(n);printf(The terminal are :n);for(i=0;isign_num-2;i+)printf(%c ,terminali.small_char);printf(n);printf(The chanshengshis right are:n);for(i=0;ichanshengshi_num;i+)printf(%sn,formulari.right);printf(The number of candidate: %d.n,candidate_num);for(i=0;icandidate_num;i+)printf(%sn,candii.candidate);printf(The F is :n);for(i=0;ino_sign_num;i+) /*输出F数组*/for(j=0;jsign_num-2;j+)printf(%d ,Fij);printf(n);/*形成布尔数组F(P,a)(正确)*/void produce_F()int i,j,s;char tempMAX; /*暂存右部字符串*/chanshengshi *p;for(i=0;ino_sign_num;i+) /*初始化F数组*/for(j=0;jsign_num-2;j+)Fij=0;for(i=0;ino_sign_num;i+)for(j=0;ja的产生式,并将F【P】【a】置为真*/Fij=TRUE;if(temp0=A) /*筛选有形如P-Qa的产生式,并将F【P】【a】置为真*/ if(temp1=terminalj.small_char)Fij=TRUE;/*形成布尔数组L(P,a)(正确)*/void produce_L()int i,j,s,d;char tempMAX; /*暂存右部字符串*/chanshengshi *p;for(i=0;ino_sign_num;i+) /*初始化F数组*/for(j=0;jsign_num-2;j+)Lij=0;for(i=0;ino_sign_num;i+)for(j=0;jsign_num-2;j+) /*去掉#和结束元素NULL*/for(s=0;formulars.left!=NULL;s+)if(formulars.left=no_terminali.big_char)strcpy(temp,formulars.right); /*将产生式的右部存入临时数组*/for(d=0;d.a的产生式,并将F【P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 烘焙店投资加盟合同范本
- 混凝土配料劳务合同范本
- 消防检测合同的补充协议
- 洗车店急需转让合同范本
- 漂流项目运营协议书范本
- 煤气管道转让协议书模板
- 泉州串串香加盟合同范本
- 物业顾问合同协议书范本
- 砂滤池清洗回填合同范本
- 铺面场地出租协议书模板
- 最全螺栓扭矩表(各种标准)
- 初二物理简单有趣的小实验
- 重庆市社会保险登记表
- GB/T 3282-2012钛铁
- GB/T 25149-2010工业设备化学清洗中碳钢钝化膜质量的测试方法红点法
- GB/T 18290.3-2000无焊连接第3部分:可接触无焊绝缘位移连接一般要求、试验方法和使用导则
- 高血压疾病证明书
- 新高三暑假弯道超车2021年高二期末主题班会学校活动ppt
- 许晓峰版电机拖动电子教案(全)课件
- 对肝癌肝切除术指证的新近认识课件讲义
- 质量过程报告记录汇总表-scr与ncr表格报检单
评论
0/150
提交评论