CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

语法分析程序

楼主joekol(小虫子)2002-06-23 21:07:12 在 C/C++ / C语言 提问

输入一个语法句子,对其进行语法分析。 问题点数:20、回复次数:2Top

1 楼doer_ljy(可战)回复于 2002-06-23 21:23:53 得分 0

不会吧?  
  这个好像是很难有,我也想知道!  
  要有什么正则什么的吧!Top

2 楼steedhorse(晨星)回复于 2002-06-23 21:28:43 得分 0

语法规则是什么,意大利语?Top

3 楼qyw728(qiao)回复于 2002-06-29 15:53:16 得分 20

语法分析程序()    
   
  #include<stdio.h>    
  #include<string.h>    
  #include<ctype.h>    
  #include<conio.h>    
  #include<stdlib.h>    
  char   a[10][20],c[20],d[10][20],f[10][20];    
  int   b[20][20],e[10][20],g[10][20],zh[10][2];    
  int   i,j,k,l,m,n,u,v;    
  char   ch[50],ck[50];    
  FILE   *fp;    
  void   get_wf()    
  {   int   bool;    
  printf("请输入算符优先文法(增广文法):\n");    
  i=0;    
  gets(a[i]);    
  while(strlen(a[i]))   gets(a[++i]);    
  for(i=0;strlen(a[i]);i++)    
  {int   z,bb=1;    
  for(z=0;d[z][0];z++)    
  if(d[z][0]==a[i][0]){bb=0;break;}    
  if(bb)d[z][0]=f[z][0]=a[i][0];    
  for(j=3;a[i][j]!='\0';j++)    
  if(!isupper(a[i][j])){    
  bool=1;    
  for(k=1;c[k];k++)    
  if(c[k]==a[i][j]){bool=0;break;}    
  if(bool)c[k]=a[i][j];    
  }    
  }    
  if((fp=fopen("wfile","w"))!=NULL){fwrite(&a,10*20*sizeof(char),1,fp);    
  fwrite(&d,10*20*sizeof(char),1,fp);    
  fwrite(&f,10*20*sizeof(char),1,fp);    
  fwrite(&c,10*sizeof(char),1,fp);}    
  }    
  void   firstvt()    
  {int   bool=1,y=0;    
  for(i=0;strlen(a[i]);i++)    
  {for(l=0;d[l][0];l++)    
  if(d[l][0]==a[i][0])   break;    
  for(j=3;j<=4;j++)    
  if(!isupper(a[i][j])){bool=0;    
  for(k=1;c[k];k++)    
  if(c[k]==a[i][j]){bool=1;break;}    
  if(bool){    
  bool=1;    
  for(m=0;d[l][m];m++)    
  if(d[l][m]==k){bool=0;break;}    
  if(bool)d[l][m]=k;   }    
  break;}    
  if(j==4){    
  for(n=0;d[n][0];n++)    
  if(d[n][0]==a[i][j-1])break;    
  zh[y][0]=l;zh[y++][1]=n;    
  }    
  }    
  for(y--;y>=0;y--)    
  for(m=1;d[zh[y][1]][m];m++)    
  {bool=1;    
  for(u=0;d[zh[y][0]][u];u++)    
  if(d[zh[y][0]][u]==d[zh[y][1]][m]){bool=0;break;}    
  if(bool)d[zh[y][0]][u]=d[zh[y][1]][m];}    
  gotoxy(20,wherey());printf("非终结符的FIRSTVT集如下:\n"   );    
  for(i=0;d[i][0];i++)    
  {   gotoxy(20,wherey());    
  printf("%4c",d[i][0]);    
  for(j=1;d[i][j];j++)    
  printf("%4c",c[d[i][j]]);    
  printf("\n");   }    
  }    
  void   lastvt()    
  {int   x=0,bool=1,y=0;    
  for(i=0;strlen(a[i]);i++)    
  {for(l=0;f[l][0];l++)    
  if(f[l][0]==a[i][0])   break;    
  j=3;while(a[i][j]!='\0')j++;    
  x=0;    
  while(x<=1)    
  {j--;    
  if(!isupper(a[i][j])){bool=0;    
  for(k=1;c[k];k++)    
  if(c[k]==a[i][j]){bool=1;break;}    
  if(bool){    
  for(m=0;f[l][m];m++)    
  if(f[l][m]==k){bool=0;break;}    
  if(bool)f[l][m]=k;   }    
  break;}    
  x++;    
  }    
  if(x==1){    
  for(n=0;f[n][0];n++)    
  if(f[n][0]==a[i][j+1])break;    
  zh[y][0]=l;zh[y++][1]=n;    
  }    
  }    
  for(y--;y>=0;y--)    
  for(m=1;f[zh[y][1]][m];m++)    
  {bool=1;    
  for(u=0;f[zh[y][0]][u];u++)    
  if(f[zh[y][0]][u]==f[zh[y][1]][m]){bool=0;break;}    
  if(bool)f[zh[y][0]][u]=f[zh[y][1]][m];}    
  gotoxy(20,wherey());printf("非终结符的LASTVT集如下:\n"   );    
  for(i=0;f[i][0];i++)    
  {   gotoxy(20,wherey());    
  printf("%4c",f[i][0]);    
  for(j=1;f[i][j];j++)    
  printf("%4c",c[f[i][j]]);    
  printf("\n");   }    
  }    
  void   rel_s()    
  {    
  for(i=0;strlen(a[i]);i++)    
  for(j=3;a[i][j]!='\0';j++)    
  if(isupper(a[i][j])){    
  for(l=0;d[l][0];l++)    
  if(d[l][0]==a[i][j]){g[i][j]=l;break;}    
  if(g[i][j]&&e[i][j-1])    
  for(m=1;d[g[i][j]][m];m++)    
  if(b[e[i][j-1]][d[g[i][j]][m]]){   gotoxy(20,wherey());   printf("该文法为非算符优先文法!\n");exit(0);}    
  else   b[e[i][j-1]][d[g[i][j]][m]]=2;    
  }    
  else{    
  for(k=1;c[k];k++)    
  if(c[k]==a[i][j]){e[i][j]=k;break;}    
  if(e[i][j]&&e[i][j-1])    
  if(b[e[i][j-1]][e[i][j]]){   gotoxy(20,wherey());printf("该文法为非算符优先文法!\n");exit(0);}    
  else   b[e[i][j-1]][e[i][j]]=1;    
  if(e[i][j]&&g[i][j-1]&&e[i][j-2])    
  if(b[e[i][j-2]][e[i][j]]){   gotoxy(20,wherey());printf("该文法为非算符优先文法!\n");exit(0);}    
  else   b[e[i][j-2]][e[i][j]]=1;    
  if(e[i][j]&&g[i][j-1])    
  for(m=1;f[g[i][j-1]][m];m++)    
  if(b[f[g[i][j-1]][m]][e[i][j]]){   gotoxy(20,wherey());printf("该文法为非算符优先文法!\n");exit(0);}    
  else   b[f[g[i][j-1]][m]][e[i][j]]=3;    
  }    
  }    
  void   g_yue()    
  {char   cc[10],ce[10];    
  int   x,t=1;    
  gotoxy(20,wherey());printf("输入要分析的字符串:"   );    
  gets(ch);    
  k=0;l=0;    
  while(ch[k]!='\0')k++;    
  ch[k]='#';ch[k+1]='\0';    
  m=0;ck[m]='#';    
  gotoxy(20,wherey());printf("分析过程如下:\n");    
  gotoxy(20,wherey());printf("步骤   栈   优先关系   当前符号   剩余串   动作\n");    
  int   bl=1,p,q;    
  for(i=0;ch[i]!='\0';i++)    
  {gotoxy(20,wherey());    
  printf("%2d",t++);    
  gotoxy(27,wherey());    
  for(u=0;u<=m;u++)    
  printf("%c",ck[u]);    
  q=0;    
  for(p=i+1;ch[p]!='\0';p++)    
  ce[q++]=ch[p];    
  ce[q]='\0';    
  for(k=1;c[k];k++)    
  if(c[k]==ch[i])j=k;    
  n=m;    
  while(isupper(ck[n]))   n--;    
  for(k=1;c[k];k++)    
  if(c[k]==ck[n])break;    
  gotoxy(37,wherey());    
  switch(b[k][j])    
  {case   1:printf("   =");break;    
  case   2:printf("   <");break;    
  case   3:printf("   >");    
  }    
  gotoxy(45,wherey());    
  printf("%c",ch[i]);    
  gotoxy(55,wherey());    
  printf("%s",ce);    
  if(b[k][j]==0){   gotoxy(20,wherey());printf("\n该字符串不是合法字符串!press   any   key---\n");bl=0;   break;}    
  else   if(b[k][j]<3){ck[++m]=ch[i];gotoxy(67,wherey());if(ch[i+1]!='\0')printf("移进\n");else   printf("接受\n");}    
  else   {i--;   gotoxy(67,wherey());   printf("规约\n");    
  x=0;    
  do    
  {n--;    
  while(isupper(ck[n]))n--;    
  for(j=0;c[j];j++)    
  if(c[j]==ck[n])break;    
  }while(b[j][k]==1);    
  u=n;    
  while(m>u)cc[x++]=ck[++u];    
  m=n;    
  for(u=0;strlen(a[u]);u++)    
  {x=1;    
  for(v=3;a[u][v]!='\0';v++)    
  if(!isupper(a[u][v])&&a[u][v]!=cc[v-3])x=0;    
  if(x){ck[++m]=a[u][0];l=0;break;   }    
  }    
  }    
  }   gotoxy(20,wherey());    
  if(bl)   printf("successful!press   any   key---");    
  _setcursortype(_NOCURSOR);    
  while(!kbhit());    
  }    
  void   main()    
  {for(i=0;i<10;i++)    
  for(j=0;j<20;j++)    
  d[i][j]=e[i][j]=f[i][j]=g[i][j]=0;    
  for(i=0;i<20;i++)    
  for(j=0;j<20;j++)    
  b[i][j]=0;    
  for(i=0;i<10;i++)    
  c[i]=0;    
  textbackground(BLUE);    
  clrscr();    
  printf("*****************************语法分析器*****************************************\n");    
  gotoxy(20,5);    
  printf("要使用新文法?(y/n):");    
  if(getchar()=='y')   {scanf("%c");get_wf();}    
  else{scanf("%c");    
  if((fp=fopen("wfile","r"))!=NULL){fread(&a,10*20*sizeof(char),1,fp);    
  fread(&d,10*20*sizeof(char),1,fp);    
  fread(&f,10*20*sizeof(char),1,fp);    
  fread(&c,10*sizeof(char),1,fp);}    
  gotoxy(20,wherey());printf("您现在使用的文法为:\n");    
  for(i=0;strlen(a[i]);i++)    
  {   gotoxy(20,wherey());    
  for(j=0;a[i][j]!='\0';j++)    
  printf("%2c",a[i][j]);    
  printf("\n");    
  }    
  }    
  for(i=0;strlen(a[i]);i++)    
  {for(j=1;a[i][j]!=0;j++)    
  if(isupper(a[i][j])&&isupper(a[i][j-1])){   gotoxy(20,wherey());printf("该文法为非算符文法!\n");   exit(0);}    
  if(j<=3){   gotoxy(20,wherey());printf("该文法为非算符优先文法!\n");   exit(0);}    
  }    
  firstvt();    
  lastvt();    
  k=1;    
  while(c[k])k++;    
  rel_s();    
  gotoxy(20,wherey());printf("所求关系矩阵如下:\n");    
  gotoxy(22,wherey());    
  for(i=1;i<=k;i++)    
  printf("%2c",c[i]);    
  printf("\n");    
  for(i=1;i<=k;i++)    
  {   gotoxy(20,wherey());    
  printf("%2c",c[i]);    
  for(j=1;j<=k;j++)    
  switch(b[i][j])    
  {case   0:printf("   ");break;    
  case   1:printf("   =");break;    
  case   2:printf("   <");break;    
  case   3:printf("   >");    
  }    
  printf("\n");    
  }    
  g_yue();    
  }    
  Top

相关问题

  • 100分求助语法分析程序
  • 语法分析!
  • 100分求救,这段文法的语法分析程序该怎么写?
  • 求用delphi编写的语法分析程序,使用LL(1)分析法。送一百分。
  • 语法分析器的设计与实现程序(c语言) 词法分析器的设计与实现程序(c语言)
  • 有人能帮我改一改这个算符优先的语法分析程序吗?
  • 各位高手望这看,高分祝圣诞!作一个简单的词法分析分析程序和一个简单的语法分析程序,来就给分.
  • 这个程序是算阶乘的,从语法分析上看可以运行啊,但是结果却都是0??谁解释一下各种原因???
  • Xml的语法分析算法????????
  • 100分求一 YACC 语法分析器

关键词

  • 语法
  • 分析
  • wherey
  • gotoxy
  • 文法
  • zh
  • 语法分析
  • printf
  • isupper
  • fwrite

得分解答快速导航

  • 帖主:joekol
  • qyw728

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo