词法分析程序的功能:

输入一个二元式,输出二元式的值。

程序调试截图如下:

 

符号与种别码对照表:

 用文法描述词法规则:

•<字母>→ a|b|c|……y|z
•<数字>→d|<整数>|.<小数>
•<整数常数>→1|2|3|···
•<标识符>→l|l<字母数字>
•<关键字>→→if|else|while|do|for|int|char|···
•<运算符>→+|-|-|/|=|=<等号>···
•<界符>→,|;|(|)|···
 
源程序代码如下:
  1 #include <stdio.h>
  2 #include <string.h>
  3 char prog[80],token[8],ch;
  4 int syn,p,m,n,sum;
  5 char *rwtab[6]={"begin","if","then","while","do","end"};
  6 void scaner(void);
  7 main()
  8 {
  9     p=0;
 10      printf("\n please input a string(end with '#'):\n");
 11      do{
 12             scanf("%c",&ch);
 13             prog[p++]=ch;
 14     }while(ch!='#');
 15      p=0;
 16     do{
 17             scaner();
 18             switch(syn)
 19              {
 20                  case 11:
 21                      printf("( %-10d%5d )\n",sum,syn);
 22                   break;
 23                   case -1:
 24                       printf("you have input a wrong string\n");
 25                       return 0;
 26                   break;
 27                   default:
 28                   printf("( %-10s%5d )\n",token,syn);
 29                   break;
 30               }
 31         }while(syn!=0);
 32  }
 33 void scaner(void)
 34 {
 35      sum=0;
 36     for(m=0;m<8;m++)
 37         token[m++]= NULL;
 38         ch=prog[p++];
 39         m=0;
 40     while((ch==' ')||(ch=='\n'))
 41         ch=prog[p++];
 42     if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
 43      {
 44           while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
 45           {
 46               token[m++]=ch;
 47                ch=prog[p++];
 48          }
 49           p--;
 50           syn=10;
 51           for(n=0;n<6;n++)
 52         if(strcmp(token,rwtab[n])==0)
 53            {
 54                syn=n+1;
 55             break;
 56            }
 57      }
 58      else if((ch>='0')&&(ch<='9'))
 59      {
 60           while((ch>='0')&&(ch<='9'))
 61         {
 62             sum=sum*10+ch-'0';
 63               ch=prog[p++];
 64         }
 65         p--;
 66            syn=11;
 67     }
 68     else
 69     {
 70         switch(ch)
 71         {
 72         case '<':
 73             token[m++]=ch;
 74             ch=prog[p++];
 75             if(ch=='=')
 76             {
 77                 syn=22;
 78                 token[m++]=ch;
 79             }
 80             else
 81             {
 82                 syn=20;
 83                 p--;
 84             }
 85         break;
 86 
 87         case '>':
 88             token[m++]=ch;
 89             ch=prog[p++];
 90             if(ch=='=')
 91             {
 92                 syn=24;
 93                 token[m++]=ch;
 94             }
 95             else
 96             {
 97                 syn=23;
 98                 p--;
 99             }
100         break;
101 
102         case '+':
103             token[m++]=ch;
104             ch=prog[p++];
105             if(ch=='+')
106             {
107                 syn=17;
108                 token[m++]=ch;
109             }
110             else
111             {
112                 syn=13;
113                 p--;
114             }
115         break;
116 
117         case '-':
118             token[m++]=ch;
119             ch=prog[p++];
120             if(ch=='-')
121             {
122                 syn=29;
123                 token[m++]=ch;
124             }
125             else
126             {
127                 syn=14;
128                 p--;
129             }
130         break;
131 
132         case '!':
133             ch=prog[p++];
134             if(ch=='=')
135             {
136                 syn=21;
137                 token[m++]=ch;
138             }
139             else
140             {
141                 syn=31;
142                 p--;
143             }
144         break;
145 
146         case '=':
147             token[m++]=ch;
148             ch=prog[p++];
149             if(ch=='=')
150             {
151                 syn=25;
152                 token[m++]=ch;
153             }
154             else
155             {
156                 syn=18;
157                 p--;
158             }
159         break;
160         case '*':
161             syn=15;
162             token[m++]=ch;
163         break;
164         case '/':
165             syn=16;
166             token[m++]=ch;
167         break;
168         case '(':
169             syn=27;
170             token[m++]=ch;
171         break;
172         case ')':
173             syn=28;
174             token[m++]=ch;
175         break;
176         case '{':
177             syn=5;
178             token[m++]=ch;
179         break;
180         case '}':
181             syn=6;
182             token[m++]=ch;
183         break;
184         case ';':
185             syn=26;
186             token[m++]=ch;
187         break;
188         case '\"':
189             syn=30;
190             token[m++]=ch;
191         break;
192         case '#':
193             syn=0;
194             token[m++]=ch;
195         break;
196         case ':':
197             syn=17;
198             token[m++]=ch;
199         break;
200         default:
201             syn=-1;
202         break;
203         }
204     }
205         token[m++]='\0';
206 }