1217递归下降语法分析程序设计
1 #include <stdio.h> 2 #include <string.h> 3 char prog[80], token[8]; 4 char ch; 5 int syn, p, m, n, sum, k=0; 6 char *rwtab[6]={"begin", "if", "then", "while", "do", "end"}; 7 void scaner(); 8 void E(); 9 void Y(); 10 void T(); 11 void B(); 12 void C(); 13 void A(); 14 void main() 15 { 16 17 18 p=0; 19 printf("请输入表达式:"); 20 do 21 { 22 scanf("%c", &ch); 23 prog[p++]=ch; 24 }while(ch!='#'); 25 p=0; 26 scaner(); 27 E(); 28 } 29 void scaner() 30 { 31 for(n=0; n<8; n++) 32 token[n]=NULL; 33 ch=prog[p++]; 34 while(ch==' '||ch=='\n') ch=prog[p++]; 35 m=0; 36 if((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')) 37 { 38 while((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')) 39 { 40 token[m++]=ch; 41 ch=prog[p++]; // 将prog数组的字母复制到ch数组中 42 } 43 token[m++]='\0'; //把token的末尾设置结束符\0 44 p--;//标记到当前token数组中不是字母的当前位置 45 syn=10;//标记字母的对应码 46 for(n=0; n<6; n++) 47 { 48 if(strcmp(token, rwtab[n])==0)//判断token对应rwtab中的哪一个,并进行对应赋对应码 49 { 50 syn=n+1; 51 break; 52 } 53 } 54 } 55 else if(ch>='0'&&ch<='9') 56 { 57 sum=0; 58 while(ch>='0'&&ch<='9') 59 { 60 sum=sum*10+ch-'0';//number用来记录所对应的数字 61 ch=prog[p++]; 62 } 63 p--; 64 syn=11;//标记数字的对应码 65 } 66 else 67 { 68 switch(ch) 69 { 70 case '<': 71 m=0; 72 token[m++]=ch; 73 ch=prog[p++]; 74 if(ch=='>') 75 { 76 syn=21;//标记”<>”的对应码 77 token[m++]=ch; 78 } 79 else if(ch=='=') 80 { 81 syn=22; //标记”<=”的对应码 82 token[m++]=ch; 83 } 84 else 85 { 86 syn=20;//标记”<”的对应码 87 p--; 88 } 89 break; 90 case '>': 91 token[m++]=ch; 92 ch=prog[p++]; 93 if(ch=='=') 94 { 95 syn=24; //标记”>=”的对应码 96 token[m++]=ch; 97 } 98 else 99 { 100 syn=23;//标记”>”的对应码 101 p--; 102 } 103 break; 104 case ':': 105 token[m++]=ch; 106 ch=prog[p++]; 107 if(ch=='=') 108 { 109 syn=18;//标记”:=”的对应码 110 token[m++]=ch; 111 } 112 else 113 { 114 syn=17;//标记”:”的对应码 115 p--; 116 } 117 break; 118 case '+': 119 syn=13;//标记”+”的对应码 120 token[m++]=ch; 121 break; 122 case '-': 123 syn=14;//标记”-”的对应码 124 token[m++]=ch; 125 break; 126 case '*': 127 syn=15;//标记”*”的对应码 128 token[m++]=ch; 129 break; 130 case '/': 131 syn=16;//标记”/”的对应码 132 token[m++]=ch; 133 break; 134 case '=': 135 syn=25;//标记”=”的对应码 136 token[m++]=ch; 137 break; 138 case ';': 139 syn=26;//标记”;”的对应码 140 token[m++]=ch; 141 break; 142 case '(': 143 syn=27;//标记”(”的对应码 144 token[m++]=ch; 145 break; 146 case ')': 147 syn=28;//标记”)”的对应码 148 token[m++]=ch; 149 break; 150 case '#': 151 syn=0;//标记”#”的对应码 152 token[m++]=ch; 153 break; 154 default: 155 syn=-1;//当不是上述字母,数字,符号时,设置 156 syn=-1; 157 } 158 token[m++]='\0'; 159 } 160 161 } 162 163 void A() 164 { 165 if(syn==10 || syn==11) 166 { 167 scaner(); 168 } 169 else if(syn==27) 170 { 171 scaner(); 172 B(); 173 if(syn==28) 174 scaner(); 175 else 176 { 177 k=1; 178 printf("Error: )错误\n"); 179 } 180 } 181 else 182 { 183 k=1; 184 printf("Error: 表达式错误\n"); 185 } 186 } 187 void C() 188 { 189 A(); 190 while(syn==15 || syn==16) 191 { 192 scaner(); 193 A(); 194 } 195 196 } 197 void B() 198 { 199 C(); 200 while(syn==13 || syn==14) 201 { 202 scaner(); 203 C(); 204 } 205 206 } 207 void T() 208 { 209 if(syn==10) 210 { 211 scaner(); 212 if(syn==18) 213 { 214 scaner(); 215 B(); 216 } 217 else 218 { 219 k=1; 220 printf("Error: 赋值号错误\n"); 221 } 222 } 223 else 224 { 225 k=1; 226 printf("Error: 表达式错误\n"); 227 } 228 } 229 void Y() 230 { 231 B(); 232 while(syn==26) 233 { 234 scaner(); 235 B(); 236 237 } 238 239 } 240 void E()//程序 241 { 242 if(syn==1) 243 { 244 scaner(); 245 Y(); 246 if(syn==6) 247 { 248 scaner(); 249 if(syn==0 && k==0) 250 printf("是正确的表达式\n"); 251 else if(syn!=0 && k==0) 252 { 253 k=1; 254 printf("Error: end后未正常结束\n"); 255 } 256 } 257 else 258 { 259 if(k!=1) 260 { 261 k=1; 262 printf("Error: end错误\n"); 263 } 264 } 265 } 266 else 267 { 268 k=1; 269 printf("Error: begin错误\n"); 270 } 271 272 }
运行结果: