语法分析-编译原理-语法分析1、 实验内容或题目编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。2、实验目的与要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。3、 实验步骤与源程序 ⑴ 实验步骤1.待分析的简单语言的语法用扩充的BNF表示如下:①<程序>::=begin<语句串>end ②<语句串>::=<语句>{;<语句>} ③<语句>::=<赋值语句> ④<赋值语句>::=ID:=<表达式> ⑤<表达式>::=<项>{+<项>|-<项>} ⑥<项>::=<因子>{*<因子>|/<因子>} ⑦<因子>::=ID|NUM|(<表达式>)
2.试验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则,输出“error”。 例如: 输入 begin a:=9;x:=2*3;b:= a + x end # 输出 success 输入 x:= a + b * c end # 输出 error
3.语法分析程序的算法思想 ①主程序示意图如下图 图C.3语法分析主程序示意图
②递归下降分析程序示意图如下图图C.4递归下降分析程序示意图
③语句串分析过程示意图如下图图C.5 语句串分析示意图
④statement语句分析函数流程如图C.6、图C.7、图C.8、图C.9所示。图C.9 factory分析函数示意图 ⑵ 源代码# include
# include char prog[80],token[8];char ch;int syn,p,m,n,sum=0,kk;char *rwtab[6]={"begin","if","then","while","do","end"};void scaner();Irparser();yucu();statement();expression();term();factor();
void main(){ p=0; printf("\n please input string:\n"); do{ scanf("%c",&prog[p++]); }while(prog[p-1]!='#'); p=0;165
语法分析kk=0; scaner(); Irparser(); getch();/* do{ scaner(); switch(syn) { case 11:printf("(11,%d) ",sum);break; case -1:printf("error! ");break; default:printf("(%d,%s) ",syn,token); getch(); } }while(syn!=0); */}
void scaner(){ for(n=0;n<8;n++) token[n]=NULL; sum=0; ch=prog[p++]; while(ch==' ') ch=prog[p++]; if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else { if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { sum=sum*10+(ch-'0'); ch=prog[p++]; } p--; syn=11; } else { switch(ch) { case '<': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=21; token[m++]=ch; } else if(ch=='=') { syn=22; token[m++]=ch; } else { syn=20; p--; } break; case '>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; p--; } break; case ':': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; p--; } break; case'+':syn=13;token[0]=ch;break; case'-':syn=14;token[0]=ch;break; case'*':syn=15;token[0]=ch;break; case'/':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; default:syn=-1; } } }}
Irparser(){ if(syn==1) { scaner(); yucu(); if(syn==6) { scaner(); if(syn==0&&kk==0) printf("success\n"); } else
编译原理 语法分析 { if(kk!=1) printf("lost 'end'\n"); kk=1; } } else { printf("lost 'begin'\n"); kk=1; } return;}
yucu(){ statement(); while(syn==26) { scaner(); statement(); } if(syn!=6) { printf("error input\n"); kk=1; } return;}
statement(){ if(syn==10) { scaner(); if(syn==18) { scaner();lwfree.cn printf("error in letter\n"); kk=1; } return;}
expression(){ term(); while(syn==13||syn==14) { scaner(); term(); } return;}
term(){ factor(); while(syn==15||syn==16) { scaner(); factor(); } return;}
factor(){ if(syn==10||syn==11) scaner(); else if(syn==27) { scaner(); expression(); if(syn==28) scaner(); else { printf("lost ')'\n"); kk=1; } } else { printf("the expression is wrong\n"); kk=1; } return;}
4、 测试数据与实验结果(可以抓图粘贴)5、 结果分析与实验体会 本次编译原理是第二次上机实验,实验的内容是语法分析,实现对单词序列语法检查和结构分析。 实验的语法分析利用C语言编制递归下降分析程序,对简单语言进行语法分析。语法分析的任务是在词法分析的基础上,根据语言的语法规则从单词符号串中识别出各种语法单位(如表达式、说明、语句等)并进行语法检查,即检查各种语法结构上的正确性。 通过本次实验,使我更加深入地了解了编译原理的语法分析的意义,为我们帮助理解课本上的知识起了非常重要的作用。