其代码如下:
#include<stdio.h> #include<string.h> int syn; void yucu();//语句串分析程序 void statement();//语句分析 void expression();//表达式分析 void item();//项分析 void factor();//因子分析 char token[1000];//存储字符串 void scanner();//扫描函数 char ch; int p; char prog[1000]; int i; char table[7][10] = { "","begin","if","then","while","do","end" }; int kk; int main(void) { p = 0; printf("\nplease input string :\n"); do { ch = getchar(); prog[p++] = ch; } while (ch != '#'); p = 0; scanner(); if (syn == 1) { scanner(); yucu(); if (syn == 6) { if (!kk) { printf("success"); } } } else { printf("应该输入'begin'error"); } return 0; } void yucu() { statement(); while (syn == 26) {//分号 scanner(); statement(); } return; } void statement()//语句分析函数 { if (syn == 10) {//标识符 scanner(); if (syn == 18)//赋值 { scanner(); expression(); } else { printf("赋值号错误error"); kk = 1; } } else { kk = 1; printf("语句错误error"); } return; } void expression() {//表达式分析函数 item(); while(syn == 13 || syn == 14) { scanner(); item(); } return; } void item()//项函数 { factor(); while (syn == 15 || syn == 16) { scanner(); factor(); } return; } void factor()//因子函数 { if (syn == 10 || syn == 11) { scanner(); } else if (syn == 27) { scanner(); expression(); if (syn == 28) { scanner(); } else { printf("缺少'('error"); } } } void scanner() { ch = prog[p++]; while (ch == ' ') { ch = prog[p++]; } if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ) { int i = 0; while (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <= '9') { token[i++] = ch; ch = prog[p++]; } p--;//由于最后一个字符不会被接纳,需要往前返回一个字符 token[i] = '\0'; for (i = 1; i <= 6; i++) { if (strcmp(token, table[i]) == 0) { syn = i; break; } } if (i > 6)syn = 10;//如果没有匹配,说明就不是关键字 } else if (ch <= '9' && ch >= '0') { i = 0; while (ch <= '9' && ch >= '0') { token[i++] = ch + 48;//将数字转化成对应字符存储在数组中 ch = prog[p++]; } p--;//由于最后一个字符不会被接纳,需要往前返回一个字符 token[i] = '\0'; syn = 11; } else { i = 0; token[i++] = ch; char ch1; switch (ch) { case '+': syn = 13; break; case '-': syn = 14; break; case '*': syn = 15; break; case '/': syn = 16; break; case ':': ch1 = prog[p];//尝试判断下一个字符 if (ch1 == '=') { token[i++] = ch1; p++;//成功就得将缓冲区字符前进一个字符 syn = 18; } else syn = 17; break; case '<': ch1 = prog[p]; if (ch1 == '=') { syn = 22; p++; token[i++] = ch1; } else if (ch1 == '>') { syn = 21; p++; token[i++] = ch1; } else syn = 20; break; case '>': ch1 = prog[p]; if (ch1 == '=') { syn = 24; p++; token[i++] = ch1; } else syn = 23; break; case '=': syn = 25; break; case ';': syn = 26; break; case '(': syn = 27; break; case ')': syn = 28; break; case '#': syn = 0; break; default: syn = -1; break; } token[i] = '\0'; } }
其结果如下: Q.E.D