编译原理语法分析

#include "stdio.h"
#include "string.h"
char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,kk,n,m,sum;

scaner();
lrparser();
yucu();
statement();
expression();

term();

factor();

 

main()
{
 p=kk=0;
 printf("\nplease input a string(end with'#'): \n");
 do
 {
  scanf("%c",&ch);
  prog[p++]=ch;
 }while(ch!='#');
 p=0;
 scaner();
 lrparser();
 getchar();
}

 

scaner()
{
 sum=0;
 for(m=0;m<8;m++)
 token[m++]='\0';
 m=0;
 ch=prog[p++];
 while(ch==' '||ch=='\n')
 ch=prog[p++];
 if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
 {
  while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch<='0')&&(ch>='9')))
  {
  token[m++]=ch;
  ch=prog[p++];
  }
  p--;
  syn=10;
  token[m++]='\0';
  for(n=0;n<6;n++)
  {
  if(strcmp(token,rwtab[n])==0)
  {
  syn=n+1;
  break;
  }//if
  }//for
    }//外层IF
  
 else if((ch>='0')&&(ch<='9'))
  {
  while((ch>='0')&&(ch<='9'))
  {
    sum=sum*10+ch-'0';
    ch=prog[p++];
  }//while
  p--;
  syn=11;
  }//else if
  
   else switch(ch)
   {
     case '<':
     m=0;
     ch=prog[p++];
     if(ch=='>')
     {
     syn=21;
     }//有问题
     else if(ch=='=')
     {
     syn=22;
     }
     else
     {
     syn=20;
     p--;
     }
     break;
     case '>':
     m=0;
     ch=prog[p++];
     if(ch=='=')
     {
     syn=24;
     }
     else
     {
     syn=23;
     p--;
     }
     break;
     case':':
     m=0;
     ch=prog[p++];
     if(ch=='=')
     {
     syn=18;
     }
     else
     {
     syn=17;
     p--;
     }
     break;
     case'+':syn=13;break;
     case'-':syn=14;break;
     case'*':syn=15;break;
     case'/':syn=16;break;
     case'(':syn=27;break;
     case')':syn=28;break;
     case'=':syn=25;break;
     case';':syn=26;break;
     case'#':syn=0;break;
     default:syn=-1;break;
     }//else swtich
}//scaner

 

lrparser()
{
 if(syn==1)
 {
   scaner();
   yucu();
   if(syn==6)
   {
     scaner();
     if((syn==0)&&(kk==0))
     printf("success!\n");
   }//内层if(syn==6)
   else
   {
    if(kk!=1)
    printf("the string haven't got a 'end'!\n");
    kk=1;
   }//内层else
 }//if(syn==1)
 else   
 {
 printf("haven't got a 'begin'!\n");
 kk=1;
 }//外层else
 return;
 }//lrparser

 

yucu()
 {
 statement();
 while(syn==26)
 {
 scaner();
 if(syn!=6)
 statement();
 }
 return;
 }//yucu

 

statement()
 {
 if(syn==10)
 {
 scaner();
 if(syn==18)
 {
  scaner();
  expression();
 }
 else
 {
 printf("the sing ':=' is wrong!\n");
 kk=1;
 }
 }//if
 
 else
 {
 printf("wrong sentence!\n");
 kk=1;
 }//else
 return;
 }//statement

 

 
 expression()
 {
 term();
 while((syn==13)||(syn==14))
 {
 scaner();
 term();
 }
 return;
 }//expression()

 

term()
 {
 factor();
 while((syn==15)||(syn==16))
 {
 scaner();
 factor();
 }
 return;
 }//term();

 

factor()
 {
 if((syn=10)||(syn=11))
 scaner();
 else if(syn==27)
 {
 scaner();
 expression();
 if(syn==28)
 scaner();
 else
 {
 printf("the error on'('\n");
 kk=1;
 }
 }//else if
 else
 {
 printf("the expression error!\m");
 kk=1;
 }//else
 return;
 }//factor

 


 

 

 

 

 


 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值