编译原理词法分析程序

#include<stdio.h>
#include<string.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner()
{   m=0;
 for(n=0;n<8;n++) token[n]=NULL;
 ch=prog[p++];
 while(ch==' ') ch=prog[p++];
 if((ch>='A' && ch<='Z')||( ch>='a'&&ch<='z'))  //是字母字符
 {
  while ((ch>='A' && ch<='Z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))//为字母字符或数字字符
  {
  token[m++]=ch;                 //ch=>token;
  ch=prog[p++];
  }
  token[m++]='/0';
     p--;                           //回退一个字符
  syn=10;
  for(n=0;n<6;n++)
  if (strcmp(token,rwtab[n])==0)
  {   syn=n+1;                    //给出syn的值;
   break;
  }
 }
 else
  if (ch>='0'&&ch<='9')           //是数字字符
  { while (ch>='0'&&ch<='9')      //为数字字符
  { sum=0;
    sum=sum*10+ch-'0';
    ch=prog[p++];
  }
   p--;
         syn=11;
  }
   else
    switch(ch)
   {
    case '<':m=0;
          token[m++]=ch;
          ch=prog[p++];
          if (ch=='>')
    { syn=21;
      token[m++]=ch;
    }
    else if (ch=='=')
    { syn=22;
      token[m++]=ch;
    }
    else
    {syn=20; 
     p--;
    }
    break;
    case '>':token[m++]=ch;             //ch=>token;
          ch=prog[p++];
          if (ch=='=')
    { syn=24;                  //>=的种别码=>syn
     token[m++]=ch;             //ch=>token;
    }
    else
    {
     syn=23;
        p--;
    }
    break;
    case ':':token[m++]=ch;             //ch=>token;
          ch=prog[p++];
    if (ch=='=')
    { syn=18;
     token[m++]=ch;           // ch=>token;
    }
    else
    { syn=17;
      p--;
    }
    break;
    case '+':syn=13;
          token[0]=ch;
    break;
    case '-':syn=14;
          token[0]=ch;
    break;
    case '*':syn=15;
          token[0]=ch;
    break;
    case '/':syn=16;
          token[0]=ch;
    break;
    case '=':syn=25;
          token[0]=ch;
    break;
    case ';':syn=26;
          token[0]=ch;
    break;
    case '(':syn=27;
          token[0]=ch;
    break;
    case ')':syn=28;
          token[0]=ch;
    break;
    case '#':syn=0;
          token[0]=ch;
    break;
       default:syn=-1;
   }
};
 
void main()
{
 p=0;
 printf("/n Please input string: /n");
 do {
  ch=getchar();
  prog[p++]=ch;
 }  while (ch!='#');
 p=0;
 do
 {
  scaner();
  switch(syn)
  {
  case 11: printf("(%d,%d)",syn,sum); break;
  case -1: printf("Error!/n"); break;
  default: printf("(%d,%s)",syn,token);
  }
 } while (syn!=0);
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值