编译原理-实验报告2-递归下降分析法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算机硬件实验室实验报告姓名学号班级成绩设备名称及软件环境递归下降分析一、实验目的:根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。二、实验要求:对下列文法,用递归下降分析法对任意输入的符号串进行分析:(1)E-TG(2)G-+TG|—TG(3)G-ε(4)T-FS(5)S-*FS|/FS(6)S-ε(7)F-(E)(8)F-i输出的格式如下:(1)递归下降分析程序,编制人:姓名,学号,班级(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#(3)输出结果:i+i*i#为合法符号串备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);三、实验过程:程序设计:1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。程序编写:1.定义部分:定义常量、变量、数据结构。2.初始化:从文件将输入符号串输入到字符缓冲区中。3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。四、实验结果(1)程序流程图(2)运行结果示例程序:#includestdio.h#includedos.h#includestdlib.h#includestring.hchara[50],b[50],d[500],e[10];charch;intn1,i1=0,flag=1,n=5;intE();intE1();intT();intG();intS();intF();voidinput();voidinput1();voidoutput();voidmain()/*递归分析*/{intf,p,j=0;charx;d[0]='E';d[1]='=';d[2]='';d[3]='T';d[4]='G';d[5]='#';printf(递归下降分析程序,编制人:武普泉,20号,1020562班\n);printf(输入一以#结束的符号串(包括+-*/()i#,且长度小于50):);do{scanf(%c,&ch);a[j]=ch;j++;}while(ch!='#');n1=j;ch=b[0]=a[0];printf(文法\t分析串\t\t\t分析字符\t\t剩余串\n);f=E1();if(f==0)return;if(ch=='#'){printf(accept\n);p=0;x=d[p];//{//printf(%c,x);p=p+1;x=d[p];/*输出推导式*///}while(a[p]!='#')printf(%c,a[p++]);printf(为合法字符!\n);}else{//printf(error\n);j=0;while(a[j]!='#')printf(%c,a[j++]);printf(非法字符!\n);printf(回车返回\n);getchar();getchar();return;}printf(\n);printf(回车返回\n);getchar();getchar();}intE1(){intf,t;printf(E--TG\t);flag=1;input();input1();f=T();if(f==0)return(0);t=G();if(t==0)return(0);elsereturn(1);}intE(){intf,t;printf(E--TG\t);e[0]='E';e[1]='=';e[2]='';e[3]='T';e[4]='G';e[5]='#';output();flag=1;input();input1();f=T();if(f==0)return(0);t=G();if(t==0)return(0);elsereturn(1);}intT(){intf,t;printf(T--FS\t);e[0]='T';e[1]='=';e[2]='';e[3]='F';e[4]='S';e[5]='#';output();flag=1;input();input1();f=F();if(f==0)return(0);t=S();if(t==0)return(0);elsereturn(1);}intG(){intf;if(ch=='+'){b[i1]=ch;printf(G--+TG\t);e[0]='G';e[1]='=';e[2]='';e[3]='+';e[4]='T';e[5]='G';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=T();if(f==0)return(0);f=G();if(f==0)return0;elsereturn1;}elseif(ch=='-'){b[i1]=ch;printf(G---TG\t);e[0]='G';e[1]='=';e[2]='';e[3]='-';e[4]='T';e[5]='G';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=T();if(f==0){//printf(G=%d\n,f);return(0);}f=G();if(f==0)return0;elsereturn1;}else{printf(G--^\t);e[0]='G';e[1]='=';e[2]='';e[3]='^';e[4]='#';output();flag=1;input();input1();return(1);}}intS(){intf,t;if(ch=='*'){b[i1]=ch;printf(S--*FS\t);e[0]='S';e[1]='=';e[2]='';e[3]='*';e[4]='F';e[5]='S';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=F();if(f==0)return(0);t=S();if(t==0)return(0);elsereturn(1);}elseif(ch=='/'){b[i1]=ch;printf(S--/FS\t);e[0]='S';e[1]='=';e[2]='';e[3]='/';e[4]='F';e[5]='S';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=F();if(f==0)return(0);t=S();if(t==0)return(0);elsereturn(1);}else{printf(S--^\t);e[0]='S';e[1]='=';e[2]='';e[3]='^';e[4]='#';output();flag=1;a[i1]=ch;input();input1();return(1);}}intF(){intf;intj;if(ch=='('){b[i1]=ch;printf(F--(E)\t);e[0]='F';e[1]='=';e[2]='';e[3]='(';e[4]='E';e[5]=')';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=E();if(f==0)return(0);if(ch==')'){b[i1]=ch;printf(F--(E)\t);flag=0;input();input1();ch=a[++i1];}else{printf(error\n);j=0;while(a[j]!='#')printf(%c,a[j++]);printf(非法字符!\n);return(0);}}elseif(ch=='i'){b[i1]=ch;printf(F--i\t);e[0]='F';e[1]='=';e[2]='';e[3]='i';e[4]='#';output();flag=0;input();input1();ch=a[++i1];}else{printf(error\n);j=0;while(a[j]!='#')printf(%c,a[j++]);printf(非法字符!\n);return(0);}return(1);}voidinput(){intj=0;for(;j=i1-flag;j++)printf(%c,b[j]);/*输出分析串*/printf(\t\t\t);printf(%c\t\t\t,ch);/*输出分析字符*/}voidinput1(){intj;for(j=i1+1-flag;jn1;j++)printf(%c,a[j]);/*输出剩余字符*/printf(\n);}voidoutput(){/*推导式计算*/intm,k,j,q;inti=0;m=0;k=0;q=0;i=n;d[n]='=';d[n+1]='';d[n+2]='#';n=n+2;i=n;i=i-2;while(d[i]!=''&&i!=0)i=i-1;i=i+1;while(d[i]!=e[0])i=i+1;q=i;m=q;k=q;while(d[m]!='')m=m-1;m=m+1;while(m!=q){d[n]=d[m];m=m+1;n=n+1;}d[n]='#';for(j=3;e[j]!='#';j++){d[n]=e[j];n=n+1;}k=k+1;while(d[k]!='='){d[n]=d[k];n=n+1;k=k+1;}d[n]='#';}

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功