1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 char prog[800],token[8]; 5 char ch; 6 int syn,p,q,sum; 7 char *rwtab[6]={"begin","if","then","while","do","end"}; 8 void scaner(); 9 main() 10 { 11 p=0; 12 printf(" please input the source code: "); 13 do{ 14 ch=getchar(); 15 prog[p]=ch; 16 p++; 17 }while(ch!='#'); 18 p=0; 19 do 20 { 21 scaner(); 22 switch(syn) 23 { 24 case 11:printf(" (%d,%d)",syn,sum);break; 25 case -1:printf(" (%s,出错)",token);break; 26 default:printf(" (%d,%s)",syn,token); 27 } 28 }while(syn!=0); 29 } 30 31 32 void scaner() 33 { 34 35 int i; 36 sum=0; 37 for(q=0;q<8;q++) 38 token[q]=NULL; 39 ch=prog[p]; 40 q=0; 41 while(ch==' '||ch==' ') 42 { 43 p++; 44 ch=prog[p]; 45 } 46 if(('a'<=ch)&&(ch<='z')||('A'<=ch)&&(ch<='Z')) 47 { 48 while(('a'<=ch)&&(ch<='z')||('A'<=ch)&&(ch<='Z')||(ch>='0'&&ch<='9')) 49 { 50 token[q]=ch; 51 p++; 52 ch=prog[p]; 53 54 q++; 55 } 56 syn=10; 57 for(i=0;i<6;i++) 58 { 59 if(strcmp(token,rwtab[i])==0) 60 { 61 syn=i+1; 62 break; 63 } 64 } 65 } 66 else if(ch>='0'&&ch<='9') 67 { 68 while((ch>='0')&&(ch<='9')) 69 { 70 sum=sum*10+ch-'0'; 71 p++; 72 ch=prog[p]; 73 } 74 syn=11; 75 } 76 else switch(ch) 77 { 78 case '+': 79 syn=13; 80 token[q++]=ch; 81 p++; 82 break; 83 case '-': 84 syn=14; 85 token[q++]=ch; 86 p++; 87 break; 88 case '*': 89 syn=15; 90 token[q++]=ch; 91 p++; 92 break; 93 case '/': 94 syn=16; 95 token[q++]=ch; 96 p++; 97 break; 98 case ':': 99 syn=17; 100 token[q++]=ch; 101 p++; 102 if(prog[p]=='=') 103 { 104 syn=18; 105 ch=prog[p]; 106 token[q++]=ch; 107 p++; 108 } 109 break; 110 case '<': 111 syn=20; 112 token[q++]=ch; 113 p++; 114 if(prog[p]=='>') 115 { 116 syn=21; 117 ch=prog[p]; 118 token[q++]=ch; 119 p++; 120 } 121 if(prog[p]=='=') 122 { 123 syn=22; 124 ch=prog[p]; 125 token[q++]=ch; 126 p++; 127 } 128 break; 129 case '>': 130 syn=23; 131 token[q++]=ch; 132 p++; 133 if(prog[p]=='=') 134 { 135 syn=24; 136 ch=prog[p]; 137 token[q++]=ch; 138 p++; 139 } 140 break; 141 case '=': 142 syn=25; 143 token[q++]=ch; 144 p++; 145 break; 146 case ';': 147 syn=26; 148 token[q++]=ch; 149 p++; 150 break; 151 case '(': 152 syn=27; 153 token[q++]=ch; 154 p++; 155 break; 156 case ')': 157 syn=28; 158 token[q++]=ch; 159 p++; 160 break; 161 case '#': 162 syn=0; 163 token[q++]=ch; 164 break; 165 } 166 }