//define.h
#define NUM 30 //the room for table
#define LISTNUM 30 //the length of aggregate
#define N 30 //proNum for each VN
################################################################
//VN.h
#include <stdio.h>
#include <string.h>
#include "define.h"
#include "aggregate.h"
typedef struct{
char name;
int state,NumOfPro,position[N],done;
struct List first,Prof[N],Follow;
}vn;
int Check_states(vn VN_struct_arr[],int NumOfVN);
int Kind(char VN_name[],int NumOfVN,char x);
int forsure(char VN_name[],int NumOfVN,char Pro[]);
void Reset(vn VN_struct_arr[],int NumOfVN);
int Changed_num(vn VN_struct_arr[],int NumOfVN);
void printAllfirstList(vn VN_struct_arr[],int NumOfVN);
void printAllfollowList(vn VN_struct_arr[],int NumOfVN);
void printAllProList(vn VN_struct_arr[],int NumOfVN,char table[][NUM]);
#############################################################
//VN.c
#include <stdio.h>
#include <string.h>
#include "VN.h"
int Check_states(vn VN_struct_arr[],int NumOfVN){ //1表示完成 ,0 表示未完成
int i;
for(i=1;i<=NumOfVN;i++)
if(VN_struct_arr[i].state=='2')
return 0;
return 1;
}
int Kind(char VN_name[],int NumOfVN,char x){//0表示终结符 ,1表示` , 2是VN
int i,flag=0;
for(i=1;i<=NumOfVN;i++)
if(VN_name[i]==x) flag++;
if(flag>=1) return 2;
if(x=='`') return 1;
return 0;
}
int forsure(char VN_name[],int NumOfVN,char Pro[]){
int i=1,k,flag0=0,flag1=0,flag2=0;
while(Pro[i] != '\n'){
k=Kind(VN_name,NumOfVN,Pro[i]);
if(k==0) flag0++;
else if(k==1) flag1++;
else flag2++;
i++;
}
if(flag0>0) return 0;
else if(flag2==0) return 1;
else return 2;
}
void Reset(vn VN_struct_arr[],int NumOfVN){
int i;
for(i=1;i<=NumOfVN;i++)
VN_struct_arr[i].done=0;
}
int Changed_num(vn VN_struct_arr[],int NumOfVN){
int i,flag=0;
for(i=1;i<=NumOfVN;i++)
if(VN_struct_arr[i].done==1)
flag++;
return flag;
}
void printAllfirstList(vn VN_struct_arr[],int NumOfVN)
{
int i;
for(i=1;i<=NumOfVN;i++)
{
printf("FIRST(%c)= ",VN_struct_arr[i].name);
printList(VN_struct_arr[i].first);
printf("\n");
}
}
void printAllfollowList(vn VN_struct_arr[],int NumOfVN)
{
int i;
for(i=1;i<=NumOfVN;i++)
{
printf("FOLLOW(%c)= ",VN_struct_arr[i].name);
printList(VN_struct_arr[i].Follow);
printf("\n");
}
}
void printAllProList(vn VN_struct_arr[],int NumOfVN,char table[][NUM])
{
int i,j,z;
for(i=1;i<=NumOfVN;i++)
{
for(j=1;j<=VN_struct_arr[i].NumOfPro;j++)
{
z=1;
printf("FIRST(");
while(table[VN_struct_arr[i].position[j]][z]!='\n')
{
printf("%c",table[VN_struct_arr[i].position[j]][z]);
z++;
}
printf(")=");
printList(VN_struct_arr[i].Prof[j]);
printf("\n");
}
}
}
##############################################################
//arrdeal.h
#include <stdio.h>
#include <string.h>
#include "define.h"
int Init(char table[]);
int Inits(char table[][NUM]);
int Input(char table[],char pose[],int pN);
int Inputs(char table[][NUM],char pose[],int pN);
int Char_to_