📄 xucefenxi2.c
字号:
#include <stdio.h>
#include <string.h>
#include<ctype.h>
#define M 10
#define N 5
FILE *fin,*out;
/*replace id with i ,replae num with n*/
char vt[M]={'+','-','*','/','%','(',')','i','n','#'};
char vn[M]={'E','A','T','B','F'}; /*replace E/ with A,replace T/ with B*/
char fa[M][N];
int ana_table[N][M]={{-2,-2,-2,-2,-2,0,-2,0,0,-2},{1,2,-2,-2,-2,-2,-1,-2,-2,-1},{-2,-2,-2,
-2,-2,3,-2,3,3,-2},{-1,-1,4,5,6,-2,-1,-2,-2,-1},{-2,-2,-2,-2,-2,7,-2,8,9,-2}};
int k=0;
int T=0;
char sta[M];
void init()
{
strcpy(fa[0],"TA");
strcpy(fa[1],"+TA");
strcpy(fa[2],"-TA");
strcpy(fa[3],"FB");
strcpy(fa[4],"*FB");
strcpy(fa[5],"/FB");
strcpy(fa[6],"%FB");
strcpy(fa[7],"(E)");
strcpy(fa[8],"i");
strcpy(fa[9],"n");
}
void err(int err)
{
if(err==1)
{fprintf(out,"there has a %cerror1\n",' ');}
if(err==2)
{fprintf(out,"there has a %cerror2\n",' ');}
if(err==3)
{fprintf(out,"there has a %cerror3\n",' ');}
}
main()
{
char x;
char a;
int i,j,L,boolen=0;
int no1,no2;
char ck;
char sourcefile[10],outfile[10];
while(1){
puts("Input the sourcefile:");
scanf("%s",sourcefile);
puts("Input the errorfile:");
scanf("%s",outfile);
if((fin=fopen(sourcefile,"r"))==NULL)
{
printf("cannot open sourcefile!\n");
}
if((out=fopen(outfile,"a+"))==NULL)
{
printf("cannot open errorfile!\n");
}
init();
a=fgetc(fin);
sta[k++]='#';
sta[k++]='E';
printf("语法分析如下\n");
printf("栈顶元素 当前单词记号 动作\n");
do{
if(T==0){x=sta[--k];}
else T=0;
for(i=0;i<M;i++)
if(x==vt[i]) boolen=1;
if(boolen==1)
{
if(x==a) {
printf("%c %c",x,a);
printf(" 匹配终结符%c\n",x);
a=fgetc(fin);
}
else err(3);
boolen=0;
}
else
{
for(i=0;i<M;i++)
if(a==vt[i]) {no2=i;break;}
for(i=0;i<N;i++)
if(x==vn[i]) {no1=i;break;}
L=ana_table[no1][no2];
if(L>=0){
for(j=strlen(fa[L])-1;j>=0;j--)
sta[k++]=fa[L][j];
printf("%c %c",x,a);
printf(" 展开非终结符%c->%s\n",x,fa[L]);
}
if(L==-1){
printf("%c %c",x,a);
printf(" 展开非终结符%c->\n",x);
err(1);
}
if(L==-2){
printf("%c %c",x,a);
printf(" 出错跳过\n");
a=fgetc(fin);
T=2;
err(2);
}
}
}while(x!='#');
printf("# #");
printf(" 结束\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -