本文档如对你有帮助,请帮忙下载支持!
char p[50][50]; int i,j,k;
printf(\请输入文法的非终结符号串:\getchar();
scanf(\ i=strlen(vn); memcpy(n,vn,i);
n[i]='\\0';
printf(\请输入文法的终结符号串:\getchar();
scanf(\ i=strlen(vt); memcpy(t,vt,i);
t[i]='\\0'; scanf(\getchar();
printf(\请输入文法产生式的条数:\getchar(); { }
if(p[j][1]!='-'||p[j][2]!='>') {
printf(\return('\\0'); validity=0;
printf(\请输入文法的第%d条(共%d条)产生式:\scanf(\
printf(\请输入文法的开始符号:\
scanf(\ for(j=1;j<=i;j++)
getchar(); for(j=0;j<=i-1;j++)
} /*检测输入错误*/ for(k=0;k<=i-1;k++)
{ /*分解输入的各产生式*/ if(p[k][3]==p[k][0]) recur(p[k]); }
/******************************************* 将单个符号或符号串并入另一符号串
********************************************/
} return(s);
else
non_re(p[k]);
本文档如对你有帮助,请帮忙下载支持!
void merge(char *d,char *s,int type)
{ /*d是目标符号串,s是源串,type=1,源串中的‘ ^ ’一并并入目串; }
/******************************************* 求所有能直接推出^的符号
********************************************/ void emp(char c)
{ /*即求所有由‘ ^ ’推出的符号*/ }
/******************************************* 求某一符号能否推出‘ ^ ’
char temp[10]; int i;
for(i=0;i<=count-1;i++) { }
if(right[i][0]==c&&strlen(right[i])==1) { }
temp[0]=left[i]; temp[1]='\\0'; merge(empty,temp,1); emp(left[i]);
type=2,源串中的‘ ^ ’不并入目串*/ for(i=0;i<=strlen(s)-1;i++) { }
else { }
for(j=0;;j++) {
if(j break; { d[j]=s[i]; d[j+1]='\\0'; break; } ; int i,j; if(type==2&&s[i]=='^') if(j==strlen(d)) 本文档如对你有帮助,请帮忙下载支持! ********************************************/ int _emp(char c) { /*若能推出,返回1;否则,返回0*/ int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\\0'; merge(empt,temp,1); if(in(c,empty)==1) { if(i==count) if(left[i]==c) /*找一个左部为c的产生式*/ { if(j==1&&in(right[i][0],empty)==1) return(1); else if(j==1&&in(right[i][0],termin)==1) else { return(0); return(1); for(i=0;;i++) return(0); j=strlen(right[i]); /*j为右部的长度*/ for(k=0;k<=j-1;k++) if(in(right[i][k],empt)==1) } } continue; return(1); else } for(k=0;k<=j-1;k++) { } result*=_emp(right[i][k]); temp[0]=right[i][k]; temp[1]='\\0'; merge(empt,temp,1); mark=1; if(mark==1) continue; { if(result==0&&i 本文档如对你有帮助,请帮忙下载支持! } /******************************************* 判断读入的文法是否正确 ********************************************/ int judge() { int i,j; } /******************************************* 求单个符号的FIRST ********************************************/ void first2(int i) { /*i为符号在所有输入符号中的序号*/ char c,temp[20]; int j,k,m; c=v[i]; char ch='^'; emp(ch); if(in(c,termin)==1) /*若为终结符*/ for(i=0;i<=count-1;i++) { } return(1); if(in(left[i],non_ter)==0) { /*若左部不在非终结符中,报错*/ } for(j=0;j<=strlen(right[i])-1;j++) { } if(in(right[i][j],non_ter)==0&&in(right[i][j],termin)==0&&right[i][j]!='^') { /*若右部某一符号不在非终结符、终结符中且不为‘ ^ ’,报错*/ } printf(\validity=0; return(0); printf(\validity=0; return(0); } { first1[i][0]=c; first1[i][1]='\\0'; } else if(in(c,non_ter)==1) /*若为非终结符*/