1、本程序是使用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/*程序中所用到的
2、结构体和变量*/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 /*候选式结构体*/
3、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; /*产生式的集合*/stru
4、ct 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; /*读取的第一个字
5、符为开始符号*/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; /*将产生式集合中的第一个空元素赋
6、值,作为扫描结束标志*/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+;fo
7、r(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) /*将不在候选式集合中的候选式加入候选式集合*/strcp
8、y(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; /*为终结符集合添加结
9、束标志,最终的数目会为所有的终结符号数目+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 num
10、ber 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 o
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1