1、char choose; /*用户输入时使用*/char empt20; /*求_emp()时使用*/char fo20; /*求FOLLOW集合时使用*/*判断一个字符是否在指定字符串中*/int in(char c,char *p)int i;if(strlen(p)=0)return(0);for(i=0;i+) if(pi=c) return(1); /*若在,返回1*/if(i=strlen(p) return(0); /*若不在,返回0*/得到一个不是非终结符的符号char c()char c=A while(in(c,non_ter)=1)c+;return(c);分解含有左递归
2、的产生式void recur(char *point) /*完整的产生式在point中*/ int j,m=0,n=3,k;char temp20,ch;ch=c(); /*得到一个非终结符*/k=strlen(non_ter);non_terk=ch;non_terk+1=0for(j=0;j printf(ninput error! validity=0; return( /*检测输入错误*/ for(k=0;kk+) /*分解输入的各产生式*/ if(pk3=pk0) recur(pk); non_re(pk);return(s);将单个符号或符号串并入另一符号串void merge(c
3、har *d,char *s,int type) /*d是目标符号串,s是源串,type1,源串中的 一并并入目串; type2,源串中的不并入目串*/ int i,j;i=strlen(s)-1; if(type=2&si= ; if(j=0) firsti0= firsti1= TEMP0= TEMP1= if(vj=p0) memcpy(firsti,first1j,strlen(first1j); firstistrlen(first1j)= memcpy(TEMP,first1j,strlen(first1j); TEMPstrlen(first1j)=else /*如果右部为符号串
4、*/if(i merge(firsti,first1j,2); merge(TEMP,first1j,2);for(k=0;=length-1; if(_emp(pk)=1&length-1) if(vm=rightik+1) merge(firsti,first1m,2); merge(TEMP,first1m,2); else if(_emp(pk)=1&k=length-1) merge(firsti,temp,1); merge(TEMP,temp,1); else if(_emp(pk)=0)求各产生式左部的FOLLOWvoid FOLLOW(int i)int j,k,m,n,re
5、sult=1;char c,temp20;c=non_teri; /*c为待求的非终结符*/merge(fo,temp,1);if(c=start) /*若为开始符号*/temp0=#merge(followi,temp,1);if(in(c,rightj)=1) /*找一个右部含有c的产生式*/ if(rightjk=c) /*k为c在该产生式右部的序号*/ if(vm=leftj) /*m为产生式左部非终结符在所有符号中的序号*/ if(k=strlen(rightj)-1) /*如果c在产生式右部的最后*/ if(in(vm,fo)=1) merge(followi,followm,1)
6、; if(Fm= FOLLOW(m); Fm= /*如果c不在产生式右部的最后*/ for(n=k+1;nn+) result*=_emp(rightjn); if(result=1) /*如果右部c后面的符号串能推出*/ /*避免循环递归*/ tempn-k-1=rightjn; tempstrlen(rightj)-k-1= FIRST(-1,temp); merge(followi,TEMP,2);Fi=判断读入文法是否为一个LL(1)文法int ll1() int i,j,length,result=1;char temp50;=49; /*初始化*/firstj0= followj0=first1j0=selectj0=TEMPj=tempj=fj=Fj=strlen(v)-1; first2(j); /*求单个符号的FIRST集合*/n各非终结符导出的first集:%c:%s ,vj,first1j);n能导空的非终结符集合:,empty);/ printf(n_emp:/for(j=0; / printf(%d ,_emp(vj); FIRST(i,righti); /*求FIRST*/=strlen(non_ter)-1; /*求FOLLOW*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1