1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 /*
5 变量说明:
6 line
7 从终端读入的字符串;
8 当前所指位置在计数器p,
9
10 字符为ch sym 每个单词符号种类token为存放的单词自身字符串;当前所指位置在计数器m number 整型常数 word 保留字表
11 */
12 char line[80],token[8],ch;
13
14 int sym, p,m, number;
15 int n;
16 char *word[6]={"begin","end","if","then","while","do"};
17 void getsym();
18 void main() //读了字符串, 直到遇.结束
19 {
20 p=0;
21 printf("\n 请输入一个单词符号,以'.'结束\n ");
22 do
23 {
24 scanf("%c",&ch);
25 line[p++]=ch;
26 }while(ch!='.');
27 line[p++]='\0';
28 //逐个单词扫描;
29 p=0;
30 do
31 {
32 getsym();
33 //当前扫描的单词存放在sym中
34 switch (sym)
35 {
36 case 0:
37 return;
38 case 2: printf("( %5d,%-10d )\n",sym,number);
39 //NUMBER
40 break;
41 case -1:printf("you have input a wrong string\n");
42 //getchar();
43 break;
44 default: printf("( %5d,%-10s )\n",sym,token);
45 break;
46 }
47 } while (sym !=0);
48 getchar();
49 }
50 void getsym()
51 {
52 for(m=0; m<8;m++)
53 token[m++]=NULL;
54 ch=line[p++];
55 m=0;
56 while((ch==' ')||(ch=='\n'))
57 //略去空格,无效字符
58 {
59 ch=line[p++];
60 }
61 //字母打头的字符串: 标识符
62 if ( (ch<='z' && ch>='a') ||(ch<='Z' && ch>='A') )
63 {
64 do
65 {
66 token[m++]=ch;
67 ch=line[p++];
68 }while((ch<='z' && ch>='a')|| (ch<='Z' &&ch>='A')||(ch>='0')&&(ch<='9'));
69 sym=1;
70 token[m++]='\0';
71 ch=line[p--];
72 for( n=0;n<6;n++)
73 {
74 if(strcmp(token,word[n])==0)
75 {
76 sym=n+17;
77 break;
78 }
79 }
80 /*********************************************************
81 *********** TODO:识别标识符IDENT 和保留字 **************
82
83 *********************************************************/
84 }
85 else if((ch>='0')&&(ch<='9'))
86 /* 数字number : 1*/
87 {
88 number=0;
89 do
90 {
91 number=number*10+ch-'0';
92 ch=line[p++];
93 }while((ch>='0')&&(ch<='9'));
94 ch=line[p--];
95 sym=2;
96
97
98
99 /*********************************************************
100 *********** TODO:识别数字NUMBER *********************
101
102 ********************************************* ***********/
103 }
104 else switch(ch)
105 {
106 case ':':
107 /* 赋值符号 */
108 token[m++]=ch;
109 ch=line[p++];
110 if (ch == '=')
111 {
112 sym = 16;
113 token[m++]=ch;
114 }
115 else
116 {
117 sym = -1;
118 }
119 break;
120 case '<':
121 /* <= 和< 符号 */
122 token[m++]=ch;
123 ch=line[p++];
124 if(ch =='=')
125 {
126 token[m++]=ch;
127 sym=10;
128 }
129 else if(ch =='>')
130 {
131 token[m++]=ch;
132 sym=8;
133 }
134 else
135 {
136 sym = 9;
137 p--;
138 }
139 break;
140 case '>':
141 /* >= 和> 符号*/
142 token[m++]=ch;
143 ch=line[p++];
144 if(ch =='=')
145 {
146 sym=12;
147 token[m++]=ch;
148 }
149 else
150 {
151 sym=11;
152 p--;
153 }
154 break;
155 case '+': sym=3;
156 token[m++]=ch;
157 break;
158 case '-': sym=4;
159 token[m++]=ch;
160 break;
161 case '*': sym=5;
162 token[m++]=ch;
163 break;
164 case '/': sym=6;
165 token[m++]=ch;
166 break;
167 case '=': sym=7;
168 token[m++]=ch;
169 break;
170 case '(': sym=13;
171 token[m++]=ch;
172 break;
173 case ')': sym=14;
174 token[m++]=ch;
175 break;
176 case ';': sym=15;
177 token[m++]=ch;
178 break;
179 case '.': sym=0;
180 token[m++]=ch;
181 break;
182 default:
183 sym=-1;
184 break;
185 }
186 token[m++]='\0';
187 }
![]()