0916词法分析

  1 #include<stdio.h>
  2 #include<string.h>
  3 int i,s=1;
  4 
  5 //判断是否数字
  6 void number(char a[])
  7 {
  8     char b[100];
  9     int m,k=0,t;
 10     m=i;
 11     while(a[m]>='0' && a[m]<='9')  
 12     {
 13         b[k]=a[m];   //用数组b存放数组a中的数字
 14         k++;
 15         m++;
 16     }
 17     i=m-1;
 18     printf("(11,");
 19     for(t=0;t<k;t++)
 20         printf("%c",b[t]);
 21     printf(")\n");
 22 }
 23 
 24 //检索关键字表格
 25 void keyword(char a[])
 26 {
 27     int k=0,m,flag=0,t;
 28     char b[100];
 29     char *key[6]={"begin","if","then","while","do","end"};
 30     m=i;
 31     while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
 32     {
 33         b[k]=a[m];   
 34         k++;
 35         m++;
 36         b[k]='\0';
 37     }
 38     i=m-1;
 39     for(t=0;t<6;t++)
 40     {
 41         if(strcmp(b,key[t])==0)  //将数组b与关键字进行比较
 42         {
 43             printf("(%d,%s)\n",t+1,key[t]);  //输出关键字
 44             flag=1;
 45         }
 46     }
 47     if(flag==0)
 48     {
 49         printf("(?,%s)\n",b);   //输出标识符
 50     }
 51 }
 52 
 53 //词法扫描函数
 54 void Fenxi(char ch,char b)
 55 {  
 56      switch(ch)
 57      {
 58         case '=':
 59             if(b==':')
 60                 printf("(18,:=)\n");
 61             else if(b=='<')
 62                 printf("(21,<=)\n");
 63             else if(b=='>')
 64                 printf("(24,>=)\n");
 65             else
 66                 printf("(25,=)\n");
 67             i++;
 68             break;
 69         case '+':
 70             printf("(13,+)\n");break;
 71         case '-':
 72             printf("(14,-)\n");break;
 73         case '*':
 74             printf("(15,*)\n");break;
 75         case '/':
 76             printf("(16,/)\n");break;
 77         case'(':
 78             printf("(27,()\n");break;
 79         case')':
 80             printf("(28,))\n");break;
 81         case ',':
 82             printf("(32,,)\n");break;
 83         case ':':
 84             if(b=='=')
 85                 printf("(18,:=)\n");
 86             else
 87                 printf("(17,:)\n");
 88             i++;
 89             break;
 90         case ';':
 91             printf("(34,;)\n");break;
 92         case '>':
 93             if(b=='=')
 94                 printf("(24,>=)\n");
 95             else
 96             {
 97                 i=i-2;
 98                 if(b=='<')
 99                     printf("(22,<>)\n");
100                 else
101                     printf("(23,>)\n");
102             }
103             i++;
104             break;
105         case '<':
106             if(b=='=')
107                 printf("(21,<=)\n");
108             else if(b=='>')
109                 printf("(22,<>)\n");
110             else
111                 printf("(20,<)\n");
112             i++;
113             break;
114         default:
115             s=0;
116             break;
117     }
118 }
119 
120 main()
121 {
122     char a[100];
123     printf("请输入源程序(以#结束):\n");
124     scanf("%[^#]s",&a);
125     printf("\n输入要分析的源程序为:\n");
126     printf("%s",a);
127     printf("\n");
128     printf("\n分析结果为:\n");
129     i=0;
130     while(i<100&&a[i]!='#')
131     {
132         if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122))   
133             keyword(a);
134         else if(a[i]>=48&&a[i]<=57)
135             number(a);
136         else
137             Fenxi(a[i],a[i+1]);
138         i++;
139     }
140     printf("\n");
141 }

转载于:https://www.cnblogs.com/blueYE00/p/4865613.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值