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 }