📄 ll(1)v(over new)v12.c
字号:
#include<stdio.h>
#include<string.h>
#include <conio.h>
#define VNlength 20
#define VTlength 20
#define length 20
FILE *fp;
char VNmember[VNlength];
char VTmember[VTlength];
int VNnum=0,VTnum=0;
struct content
{
char data[VTlength][length];
};
typedef struct content preTable;
typedef char DataType;
typedef int position;
typedef struct node
{
DataType info;
struct node *link;
}*Stack;
void storeVN_VT()
{
strcpy(VNmember,"EMTNF");
VNnum=5;
strcpy(VTmember,"i+*()");
VTnum=5;
}
int judgeVNnum(char ch)
{
int i;
for(i=0;i<VNnum;i++)
{
if(VNmember[i]==ch)
return i;
}
return VNnum+1;
}
int judgeVTnum(char ch)
{
int i;
if(ch=='#') return VTnum;
for(i=0;i<VTnum;i++)
{
if(VTmember[i]==ch)
return i;
}
return VTnum+1;
}
void storePredict(preTable table[VNlength])
{
preTable *preOne;
int i;
for(i=0;i<VNnum;i++)
{
if(i==0)
{
strcpy(table[i].data[0],"E->TM");
strcpy(table[i].data[3],"E->TM");
}
else if(i==1)
{
strcpy(table[i].data[1],"M->+TM");
strcpy(table[i].data[4],"M->$");
strcpy(table[i].data[5],"M->$");
}
else if(i==2)
{
strcpy(table[i].data[0],"T->FN");
strcpy(table[i].data[3],"T->FN");
}
else if(i==3)
{
strcpy(table[i].data[1],"N->$");
strcpy(table[i].data[2],"N->*FN");
strcpy(table[i].data[4],"N->$");
strcpy(table[i].data[5],"N->$");
}
else if(i==4)
{
strcpy(table[i].data[0],"F->i");
strcpy(table[i].data[3],"F->(E)");
}
}
if((fp=fopen("store.txt","wb+"))==NULL)
{exit(0);}
preOne = table;
fwrite(preOne,sizeof(struct content),VNnum,fp);
fclose(fp);
}
void printTable()
{
int i,j,k;
preTable *readFile;
preTable Store[VNlength];
readFile = Store;
if((fp=fopen("store.txt","r"))==NULL)
{exit(0);}
fread(readFile,sizeof(struct content),VNnum,fp);
printf("\t");
for(i=0;i<VTnum;i++)
printf("%c\t",VTmember[i]);
printf("#\t\n");
for(i=0;i<VNnum;i++,readFile++)
{
printf("%c\t",VNmember[i]);
for(j=0;j<VTnum+1;j++)
{
if(!strcmp(readFile->data[j],""))
printf("null\t");
else
printf("%s\t",readFile->data[j]);
}
printf("\n");
}
fclose(fp);
}
Stack createNullStack(void)
{
Stack h;
h=(Stack)malloc(sizeof(struct node));
h->link=NULL;
h->info=5;
return h;
}
IsEmptyStack(Stack S)
{
if(S->link==NULL) return 1;
else return 0;
}
push(Stack S,DataType x)
{
Stack p;
p=(Stack)malloc(sizeof(struct node));
p->info=x;
p->link=S->link;
S->link=p;
}
pop(Stack S)
{
Stack p;
p=S->link;
S->link=p->link;
free(p);
}
DataType top(Stack S)
{
return S->link->info;
}
void printProcess(preTable table[VNlength],Stack stack,Stack temp,int tag,DataType *input,char VN,int Vt,int line)
{
char ch,i=0,k,t;
while(!IsEmptyStack(stack))
{
push(temp,top(stack));
pop(stack);
}
if(line==1)
{
printf("\n");
printf("\t Analysis process\n");
printf("step\tstack\tstring\tmatch\n");
}
printf("%d\t",line);
while(!IsEmptyStack(temp))
{
i++;
ch=top(temp);
push(stack,ch);
pop(temp);
printf("%c",ch);
}
for(k=i;k<8;k++) printf(" ");
i=0;
for(k=tag;input[k]!='\0';k++) {printf("%c",input[k]); i++;}
for(k=i;k<8;k++) printf(" ");
k=judgeVNnum(VN);
if(k<VNnum&&Vt<=VTnum) printf("%s",table[k].data[Vt]);
else if(k>VNnum&&VN==input[tag]&&VN!='#') printf("\"%c\" match",VN);
else if(k>VNnum&&VN==input[tag]&&VN=='#') printf("accept");
printf("\n");
}
int Analysis(char *input,preTable table[VNlength])
{
int tag=0,i,flag,k,Vt,l,m,line=1;
char chFirst;
Stack strContent,temp;
strContent=createNullStack();
temp=createNullStack();
push(strContent,'#');
push(strContent,VNmember[0]);
strcat(input,"#");
while(1)
{
chFirst=top(strContent);
k=judgeVTnum(chFirst);
Vt=judgeVTnum(input[tag]);
printProcess(table,strContent,temp,tag,input,chFirst,Vt,line);
pop(strContent);
line++;
if(k<VTnum)
{
if(chFirst!=input[tag]) return 0;
tag++;
continue;
}
else if(k>VTnum)
{
k=judgeVNnum(chFirst);
if(Vt<VTnum)
{
if(!strcmp(table[k].data[Vt],"")) return 0;
}
for(i=0;table[k].data[Vt][i]!='\0';i++) {m=i;}
for(l=m;table[k].data[Vt][l]!='>';l--)
{
if(table[k].data[Vt][l]=='$') break;
push(strContent,table[k].data[Vt][l]);
}
continue;
}
else
{
if(chFirst!=input[tag]) return 0;
return 1;
}
}
}
void main()
{
preTable table[VNlength];
char input[20];
storeVN_VT();
storePredict(table);
printTable();
printf("Please input the string:\n");
scanf("%s",input);
if(!Analysis(input,table)) printf("error!");
else
printf("Success.");
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -