老师有木有让你写个语法分析器
在网上找也难 所以的福利了 绝对可以运行
apart_from。h文件
void apart(){
int i,len,k=0,j,l,p;
for(i=0;i<sum;i++){
for(j=0;j<k;j++){
if(ter_symbol[j]==form[i].formula[0])
break;
}
if(j==k)
ter_symbol[k++] = form[i].formula[0];
}//新的非终结符加入
ter_symbol[k]='\0';
k=0;
for(i=0;i<sum;i++){
len = strlen(form[i].formula);
for(j=3;j<len;j++){
if(form[i].formula[j]=='$')
break;
for(l=0;l<strlen(ter_symbol);l++){
if(form[i].formula[j]==ter_symbol[l])
break;
}
for(p=0;p<k;p++){
if(form[i].formula[j]==non_ter[p])
break;
}
if(l==strlen(ter_symbol)&&p==k){
non_ter[k++]=form[i].formula[j];
}
}
}//终结符
non_ter[k]='\0';
}
first.h
//求一个非终结符的first集
int getFirst(char a,int col){
int i,j,k=1,l,p;
for(i=0;i<sum;i++){
if(form[i].formula[0]==a){
for(j=0;j<strlen(non_ter);j++){
if(form[i].formula[3]==non_ter[j])
break;
} //判断是否是终结符
if(j<strlen(non_ter)){
if(is_sameFir(col,k,form[i].formula[3]))
first_set[col][k++]=form[i].formula[3];
continue;
}//右部首字母是终结符;
else if(form[i].formula[3]=='$'){
if(is_sameFir(col,k,'$'))
first_set[col][k++]='$';
continue;
}//右部首字母是kong;
else if(form[i].formula[3]==a)
continue;//右部首字母是自己;
else{//printf("%d 1\n",col);
for(l=3;l<strlen(form[i].formula);l++){//循环表达式找
for(j=0;j<strlen(ter_symbol);j++){//printf("%d 2\n",col);
if(form[i].formula[l]==ter_symbol[j])
break;
}//找到非终结符的下标
if(j==strlen(ter_symbol)){//printf("%d 3\n",col);
if(is_sameFir(col,k,form[i].formula[l]))
first_set[col][k++]=form[i].formula[l];
break;
}//循环中碰到终结符,结束
if(first_set[j][0]=='0')
getFirst(form[i].formula[l],j);//printf("%d 4\n",col);}//first集未求,递归求first集
for(p=1;p<strlen(f