语法分析器在词法分析器的基础上增加了递归下降分析程序,咱也不知道啥是递归下降程序,咱也不想问。
但是有程序框图和伪代码把程序跑通咱还是比较在行滴。为了便于理解,debug过程中的输出也保留了。


下面是完整代码。
1 /* 2 begin a:= 9; x:=2*3;b:=a+x end# 3 x:= a+b*c end # 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #define _KEY_WORD_END "waiting for your expanding" 9 typedef struct 10 { 11 int typenum; 12 char *word; 13 }WORD; 14 char input[255]; 15 char token[255]=""; 16 int p_input; 17 int p_token; 18 char ch; 19 char* rwtab[] = {"begin","if","then","while","do","end",_KEY_WORD_END}; 20 WORD * scaner(); 21 WORD* oneword = new WORD; 22 int syn,kk; 23 void expression(); 24 void factor() 25 { 26 if(syn == 10 || syn == 11) 27 { 28 oneword = scaner(); 29 syn = oneword->typenum; 30 printf("%s %d ",oneword->word,syn); 31 } 32 else if(syn == 27) 33 { 34 oneword = scaner(); 35 syn = oneword->typenum; 36 printf("%s %d ",oneword->word,syn); 37 expression(); 38 if(syn == 28) 39 { 40 oneword = scaner(); 41 syn = oneword->typenum; 42 printf("%s %d ",oneword->word,syn); 43 } 44 else{ 45 printf("右括号错误 "); 46 kk = 1; 47 } 48 } 49 else 50 { 51 printf("表达式错误 "); 52 kk = 1; 53 } 54 return; 55 } 56 void term() 57 { 58 factor(); 59 while(syn == 15 || syn == 16) 60 { 61 oneword = scaner(); 62 syn = oneword->typenum; 63 printf("%s %d ",oneword->word,syn); 64 factor(); 65 } 66 return; 67 } 68 void expression() 69 { 70 term(); 71 while(syn == 13 || syn == 14) 72 { 73 oneword = scaner(); 74 syn = oneword->typenum; 75 printf("%s %d ",oneword->word,syn); 76 term(); 77 } 78 return; 79 } 80 void statement() 81 { 82 if(syn == 10) 83 { 84 oneword = scaner(); 85 syn = oneword->typenum; 86 printf("%s %d ",oneword->word,syn); 87 if(syn == 18) 88 { 89 oneword = scaner(); 90 syn = oneword->typenum; 91 printf("%s %d ",oneword->word,syn); 92 expression(); 93 } 94 else{ 95 printf("赋值号错误 "); 96 kk = 1; 97 } 98 } 99 else{ 100 printf("语句错误 "); 101 kk = 1; 102 } 103 return; 104 } 105 void yucu() 106 { 107 statement(); 108 while(syn == 26) 109 { 110 oneword = scaner(); 111 syn = oneword->typenum; 112 printf("%s %d ",oneword->word,syn); 113 statement(); 114 } 115 return; 116 } 117 void Irparser() 118 { 119 if(syn == 1) 120 { 121 oneword = scaner(); 122 syn = oneword->typenum; 123 printf("%s %d ",oneword->word,syn); 124 yucu(); 125 126 if(syn==6) 127 { 128 oneword = scaner(); 129 syn = oneword->typenum; 130 if(syn == 0 && (kk == 0)) 131 printf("success "); 132 } 133 else{ 134 if(kk != 1) 135 { 136 printf("缺少end错误 "); 137 kk = 1; 138 } 139 } 140 } 141 else{ 142 printf("begin错误 "); 143 kk = 1; 144 } 145 return; 146 } 147 int main() 148 { 149 int over = 1; 150 151 printf("Enter Your words(end with #):"); 152 scanf("%[^#]s",input); 153 p_input = 0; 154 printf("Your words: %s ",input); 155 156 //获取下一个单词符号 157 oneword = scaner(); 158 syn = oneword->typenum; 159 Irparser(); 160 161 printf(" press # to exit:"); 162 scanf("%[^#]s",input); 163 return 0; 164 } 165 char m_getch() 166 { 167 ch = input[p_input]; 168 p_input = p_input+1; 169 return(ch); 170 } 171 void getbc() 172 { 173 while(ch == ' '||ch == 10) 174 { 175 ch = input[p_input]; 176 p_input++; 177 } 178 } 179 void concat() 180 { 181 token[p_token] = ch; 182 p_token++; 183 token[p_token] = '