论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

语法分析

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:36:42

/*这是编译原理的一个作业题,是作语法分析的.建表是手工的,因此具有些局限性,不过可以给大家参考。*/
#include<stdio.h>
main()
{
 char b[100],a[50];
 int k,j,p,i,v,t;
 int q1,q2,q3,q4,q5,f;
 char c[6][7]={
     '0','i','+','*','(',')','#',
     'E','1','N','n','1','N','N',
     'H','N','2','N','N','0','0',
     'T','3','N','N','3','N','N',
     'I','N','0','4','N','0','0',
     'F','i','N','N','5','N','N',
 }; /*建的语法分析表,语法如下:E::TH;H::+TH;H::空;T::FI;I::*FI;I::空;F::i;F::(E).0表示空,N表示出错*/
    char sting1[5]={'H','T'};
  char sting2[5]={'H','T','+'};
 char sting3[5]={'I','F'};
 char sting4[5]={'I','F','*'};
 char sting5[5]={')','E','('};/*设置字符串以供比较之用*/
loop:
 k=0;
 j=0;
 p=0;
 k=0;
 i=0;
 f=0;
   q2=0;
   v=0;
   t=0;
   printf("输入要验证的字符,只包括'+','i','*','(',')',以#号结束:\n");
 while(b[i-1]!='#'&&b[i-1]!='\n')/*输入语句*/
 {
  scanf("%c",&b[i]);
      i++;
 }

  for(q1=0;q1<i;q1++)
 {
  if(b[q1]!='i'&&b[q1]!='+'&&b[q1]!='*'&&b[q1]!='('&&b[q1]!=')'&&b[q1]!='#')
   goto exit;/*看输入是否有非法字符*/
 }
  a[p]='#';
    p++;
 a[p]='E';/*从E开始推*/
loop1:
 k=0;j=0;
 while(c[k][0]!=a[p])
 {
  k++;
 if(a[p]=='#')
  goto loop3;
 }
  while(c[0][j]!=b[f]&&j<7)
  j++;/*查表*/
/*以下是推导过程*/

if(c[k][j]=='1'||c[k][j]=='2'||c[k][j]=='3'||c[k][j]=='4'||c[k][j]=='5')
switch(c[k][j])/*和字符串匹配*/
{
case'1':/*和sting1匹配*/
 {
  q1=1;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting1[q2];
         q1--;
         q2++;
  }
 }break;
case'2':/*和sting2 匹配*/
 {
  q1=2;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting2[q2];
         q1--;
      q2++;
  }
 }break;
case'3':/*和sting3匹配*/
 {
  q1=1;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting3[q2];
         q1--;
         q2++;
  }
 }break;
case'4':/*和sting4匹配*/
 {
  q1=2;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting4[q2];
         q1--;
         q2++;
  }
 }break;
case'5':/*和sting5匹配*/
 {
  q1=2;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting5[q2];
         q1--;
      q2++;
  }
 }break;
}
/*和单字符匹配*/
 if(c[k][j]=='N')
  goto exit;
 else if(c[k][j]=='0')
 { p--;
 goto loop1;}
 else if(c[k][j]=='i')
  a[p]=c[k][j];
 if(a[p]=='i'||a[p]=='+'||a[p]=='*'||a[p]=='('||a[p]==')')
 {
  if(a[p]==b[f])
  {p--;
  f++;
  goto loop1;
  }
  else
           goto exit;
 }
 else if(a[p]=='E'||a[p]=='H'||a[p]=='T'||a[p]=='I'||a[p]=='F')
   goto loop1;/*反复,直到结束*/
 else if(a[p]=='#')
  {
loop3:   if(a[p]==b[f])
   { v=1;
    goto exit;
   }
   else
    goto exit;
  }
   else
    goto exit;

exit:
   if(v==1)
    printf("识别成功\n");
   else
    printf("出错,有可能是没有以#结束,语法不正确,或者输入了其它字符\n");
   getchar();
}




视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058