⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xucefenxi2.c

📁 llr(1)C语言文法分析器
💻 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 + -