• 大小: 205KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-22
  • 语言: C/C++
  • 标签: C  语法分析  源代码  

资源简介

C语言写的语法分析器,对于给出的任意LL1文法,实现了求First集,Follow集,预测分析表的生成,分析栈分析句子的合法性。原创的

资源截图

代码片段和文件信息

#include 
#include 

#define Stack_Size 50

char proc[50][50]; /*产生式*/
char start;   /*开始符号*/
char non_ter[50]; /*非终结符*/
char termin[50];  /*终结符*/
int count;   /*产生式的个数*/
char first[50][50]; /*first集*/
char follow[50][50];/*follow集*/
char M[10][10][50]={‘\0‘}; /*预测分析表*/
typedef struct{
   char elem[Stack_Size];
   int top;
}SeqStack;

void InitStack(SeqStack *S){   /*初始化顺序栈*/
   S->top = -1;
}
int Push(SeqStack *Schar *x){  /*进栈*/
   if(S->top ==Stack_Size-1)
   return 0;
   S->top++;
   S->elem[S->top]=x;
   return 1;
}
int Pop(SeqStack *S){  /*出栈*/
  if(S->top==-1)
  return 0;
  else{
S->top--;
return 1;
  }
}
int GetTop(SeqStack *Schar *x){  /*取栈顶元素*/
  if(S->top==-1)
  return 0;
  else{
  *x=S->elem[S->top];
  return 1;
  }
}
void ShowStack1(SeqStack *S){  /*显示栈的字符,先输出栈底元素*/
  char c;
  int i;
  for(i=0;i<=S->top;i++)
  printf(“%c“S->elem[i]);
}
void ShowStack2(SeqStack *S){  /*显示栈的字符,先输出栈顶元素*/
  char c;
  int i;
  for(i=S->top;i>=0;i--)
  printf(“%c“S->elem[i]);
}
int iss(char s[]char cint n){  /*判断字符数组s中,是否有字符c,返回下标*/
   int i;
   for(i=n;i      if(c==s[i])
  break;
   }
   if(i==strlen(s))
   return -1;
   return i;
}
void removeEqqual(char s[]){  /*除去字符数组中重复的元素*/
   char str[50];
   int ijm=0;
   for(i=0;i       str[m++] = s[i];
   for(j=0;j    if(s[j]==str[m-1]){
   m--;   break;
   }
   }
   for(i=0;i    s[i]=str[i];
   s[m]=‘\0‘;
}
void init(){   /*初始化 产生式,开始符号,非终结符,终结符 */
char ch;
    FILE *fp; 
    int ijm;
    if((fp=fopen(“change.txt““r“))==NULL)
    {
        printf(“cannot open the file(source.txt)!“);
        exit(0);
    }
    ch=fgetc(fp);
start= ch;
    for(i =0;ch!=EOF;i++){
count++;
j=0;
non_ter[i]=ch;
        while(ch!=‘\n‘&&ch!=EOF){  
          proc[i][j++] = ch;
          ch = fgetc(fp);
        }
    proc[i][j]=‘\0‘;
    ch = fgetc(fp);
    }
m=0;
    for(i=0;i for(j=3;j if(iss(non_terproc[i][j]0)==-1&&proc[i][j]!=‘$‘&&proc[i][j]!=‘|‘){
    termin[m++] = proc[i][j];
}
}
}
    removeEqqual(termin);
removeEqqual(non_ter);
    printf(“共有%d句文法:\n“count);
    for(i=0;i       printf(“\t%s\n“proc[i]);
printf(“终结符有: “);
for(i=0;i printf(“%c  “termin[i]);
printf(“\n非终结符有: “);
for(i=0;i printf(“%c  “non_ter[i]);
printf(“\n“);
}
void firstSet(){   /*求 first 集*/
   int ijnmqkp;
   int flag=1;
   char c1[50]c2[50]c3[50];
   for(i=strlen(non_ter)-1;i>=0;i--){  
   for(j=3;j    m=0;                 /*先记录形如A->aB|的 a */
       first[i][m++] = proc[i][3];
   q = iss(non_terproc[i][3]0);
   p=3;
   while(q!=-1&&iss(first[q]‘$‘0)!=-1){  /*若A->aB  first[a]中有$时,将B的first集加入A中*/
   first[i][m++] = proc[i][p+1];
       p = iss(proc[i]‘|‘p+1);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    .CA....        58  2010-06-07 08:33  语法分析\change.txt

    .CA....    200789  2010-06-08 00:17  语法分析\Debug\test.exe

    .CA....    249920  2010-06-08 00:17  语法分析\Debug\test.ilk

    .CA....     26284  2010-06-08 00:17  语法分析\Debug\test.obj

    .CA....    181604  2010-06-07 16:47  语法分析\Debug\test.pch

    .CA....    508928  2010-06-08 00:17  语法分析\Debug\test.pdb

    .CA....     33792  2010-06-08 00:17  语法分析\Debug\vc60.idb

    .CA....     53248  2010-06-08 00:17  语法分析\Debug\vc60.pdb

    .CA....        38  2010-05-12 13:18  语法分析\source.txt

    .CA....      8346  2010-06-07 21:50  语法分析\TEST.BAK

    .CA....      9732  2010-06-08 00:17  语法分析\test.c

    .CA....      3375  2010-06-08 00:17  语法分析\test.dsp

    .CA....       533  2010-06-08 00:18  语法分析\test.dsw

    .CA....     41984  2010-06-08 00:18  语法分析\test.ncb

    .CA....     48640  2010-06-08 00:18  语法分析\test.opt

    .CA....      5798  2010-06-08 00:17  语法分析\test.plg

    .C.D...         0  2010-06-08 00:21  语法分析\Debug

    .C.D...         0  2010-06-11 20:39  语法分析

----------- ---------  ---------- -----  ----

              1373069                    18


评论

共有 条评论