一、实验目的:
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
二、实验原理
每个非终结符都对应一个子程序。
该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端:
三、实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。
例如:
输入begin a:=9;x:=2*3;b:=a+x end #
输出success
输入x:=a+b*c end #
输出‘end‘ error
四、实验步骤
1.待分析的语言的语法(参考P90)
2.将其改为文法表示,至少包含
–语句
–条件
–表达式
3. 消除其左递归
4. 提取公共左因子
5. SELECT集计算
6. LL(1)文法判断
7. 递归下降分析程序
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 char prog[800],dc[8]; 5 char ch; 6 int syn,p,m=0; 7 int n,sum=0; 8 char *word[6]={"begin","if","then","while","do","end"}; 9 int kk=0; 10 void scaner(); 11 void lrparser(); 12 void yucu(); 13 void statement(); 14 void condition(); 15 void expression(); 16 void term(); 17 void factor(); 18 void scaner(){ 19 m=0; 20 for(n=0;n<8;n++){ 21 dc[n]=NULL; 22 } 23 ch=prog[p++]; 24 while(ch==‘ ‘){ 25 ch=prog[p]; 26 p++; 27 } 28 //标识符 29 if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)){ 30 m=0; 31 while((ch>=‘0‘&&ch<=‘9‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)){ 32 dc[m++]=ch; 33 ch=prog[p++]; 34 } 35 p--; 36 syn=10; 37 //保留字 38 for(n=0;n<6;n++){ 39 if(strcmp(dc,word[n])==0){ 40 syn=n+1; 41 break; 42 } 43 } 44 } 45 //数字 46 else if((ch>=‘0‘&&ch<=‘9‘)){ 47 sum=0; 48 while((ch>=‘0‘&&ch<=‘9‘)){ 49 sum=sum*10+ch-‘0‘; 50 ch=prog[p++]; 51 } 52 p--; 53 syn=11; 54 } 55 else{ 56 switch(ch){ 57 case ‘<‘:m=0; 58 dc[m++]=ch; 59 ch=prog[p++]; 60 if(ch==‘>‘){ 61 syn=22; 62 dc[m++]=ch; 63 } 64 else if(ch==‘=‘){ 65 syn=21; 66 dc[m++]=ch; 67 } 68 else{ 69 syn=20; 70 p--; 71 } 72 break; 73 case ‘>‘:m=0; 74 dc[m++]=ch; 75 ch=prog[p++]; 76 if(ch==‘=‘){ 77 syn=24; 78 dc[m++]=ch; 79 } 80 else{ 81 syn=23; 82 p--; 83 } 84 break; 85 case ‘:‘:m=0; 86 dc[m++]=ch; 87 ch=prog[p++]; 88 if(ch==‘=‘){ 89 syn=18; 90 dc[m++]=ch; 91 } 92 else{ 93 syn=17; 94 p--; 95 } 96 break; 97 case ‘*‘:syn=15;dc[0]=ch;break; 98 case ‘/‘:syn=16;dc[0]=ch;break; 99 case ‘+‘:syn=13;dc[0]=ch;break; 100 case ‘-‘:syn=14;dc[0]=ch;break; 101 case ‘=‘:syn=25;dc[0]=ch;break; 102 case ‘;‘:syn=26;dc[0]=ch;break; 103 case ‘(‘:syn=27;dc[0]=ch;break; 104 case ‘)‘:syn=28;dc[0]=ch;break; 105 case ‘#‘:syn=0;dc[0]=ch;break; 106 case ‘\n‘:syn=-2;dc[0]=ch;break; 107 } 108 } 109 } 110 111 void lrparser(){ 112 if (syn==1) { 113 scaner(); 114 yucu(); 115 if (syn==6) { 116 scaner(); 117 if (syn==0 && kk==0){ 118 printf("success \n"); 119 } 120 } 121 else { 122 printf("error,lose ‘end‘ ! \n"); 123 kk=1; 124 exit(0); 125 } 126 } 127 else { 128 printf("error,lose ‘begin‘ ! \n"); 129 kk=1; 130 exit(0); 131 } 132 return; 133 } 134 135 void yucu() { 136 statement(); 137 while(syn==26) { 138 scaner(); 139 statement(); 140 } 141 return; 142 } 143 144 void statement(){ 145 if (syn==10) { 146 scaner(); 147 if (syn==18) { 148 scaner(); 149 expression(); 150 } 151 else { 152 printf("error!"); 153 kk=1; 154 exit(0); 155 } 156 } 157 else if(syn==2){ 158 condition(); 159 scaner(); 160 if(syn==3){ 161 statement(); 162 } 163 else{ 164 printf("error,lose ‘then‘ ! \n"); 165 kk=1; 166 exit(0); 167 } 168 } 169 else { 170 printf("error!"); 171 kk=1; 172 exit(0); 173 } 174 175 return; 176 } 177 178 void condition(){ 179 expression(); 180 if(syn==25||syn==0||syn==20||syn==21||syn==23||syn==24){ 181 scaner(); 182 } 183 else{ 184 printf("error! \n"); 185 kk=1; 186 exit(0); 187 } 188 expression(); 189 return; 190 } 191 192 void expression(){ 193 term(); 194 while(syn==13 || syn==14) { 195 scaner(); 196 term(); 197 } 198 return; 199 } 200 201 void term(){ 202 factor(); 203 while(syn==15 || syn==16) { 204 scaner(); 205 factor(); 206 } 207 return; 208 } 209 210 void factor(){ 211 if(syn==10 || syn==11){ 212 scaner(); 213 } 214 else if(syn==27) { 215 scaner(); 216 expression(); 217 if(syn==28){ 218 scaner(); 219 } 220 else { 221 printf(" ‘)‘ 错误\n"); 222 kk=1; 223 exit(0); 224 } 225 } else { 226 printf("表达式错误\n"); 227 kk=1; 228 exit(0); 229 } 230 return; 231 } 232 int main(void){ 233 p=0; 234 int i; 235 printf("请输入:\n"); 236 do { 237 scanf("%c",&ch); 238 prog[p++]=ch; 239 } while(ch!=‘#‘); 240 p=0; 241 do{ 242 scaner(); 243 lrparser(); 244 }while(syn!=0); 245 printf("语法分析结束!\n"); 246 247 }
原文:https://www.cnblogs.com/xiaolan-Lin/p/11933298.html