编译原理之 语法分析c代码

来源:互联网 发布:淘宝网注册开店流程 编辑:程序博客网 时间:2024/06/10 07:28
#include <stdio.h>
int zbm[255]={1,10,18,11,13,11,26,6};//转换为种别码序列的“begin a:=22+33; end ”
int zb;//种别码指针
int kk=0;//标识错误类型
void lrparser();


main()
{
printf("语法分析结果:\n");
lrparser();
}
void factor() 
{
void expression();


if(zbm[zb]==10||zbm[zb]==11)
zb++;
else  
  if (zbm[zb]==27)
{
        zb++;
expression();
if (zbm[zb]==28)
{
zb++;

}
else
{
printf("')'错误!\n");
kk=1;
}
}
   else
{
printf("表达式错误!\n");
kk=1;
}



}
void term()
{


factor( );
while(zbm[zb]==15||zbm[zb]==16)
{
zb++;
factor();
}
}
void expression()
{
term();
while(zbm[zb]==13||zbm[zb]==14)
{
zb++;
term();
}
}
void statement()
{
if(zbm[zb]==10)
{
zb++;
if(zbm[zb]==18)
{
zb++;
expression();
}
else
{
printf("赋值符号错误!\n");
kk=1;
}

}
else
if(zbm[zb]!=6)//书上没有这句。
{
printf("语句错误!\n");
kk=1;
}
}


void yucu()
{
statement();
while(zbm[zb]==26)
{
zb++;
statement();
}
}
void lrparser ()
{   
zb=0;
   if(zbm[zb]==1)
   {
  zb++;
  yucu();
  if(zbm[zb]==6)
  {
  zb++;
  if(zbm[zb]==0&&kk==0)
  printf("success!\n");
  }
  else
      if(kk!=1)
  {
  printf("'缺end'错误!\n");
  kk=1;
  }


   }
    else
{
printf("'begin'错误!\n");
kk=1;
}


}