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

本文介绍了一个简单的LR解析器实现过程,用于对特定的输入字符串进行语法分析。该解析器能够处理基本的编程语言结构,如表达式、语句等,并能报告在解析过程中遇到的各种语法错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值