144+梁肇森

  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 } 

原文地址:https://www.cnblogs.com/lzs741788135/p/5924016.html