实验 递归下降分析程序实验
Posted 天空遗落之物
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验 递归下降分析程序实验相关的知识,希望对你有一定的参考价值。
实验三、 递归下降分析程序实验
专业:信息技术与工程学院 姓名:吕军 学号:201506110159
一、 实验目的
目的: 通过设计,编制一个典型的语法分析程序,通过递归下降LL(1)文法思想,实现对词法分析程序提供的语法检查和结构分析,检查该语句语法是否正确。
二、 实验内容和要求
实验内容:编写LL(1) 语法分析程序,用户输入一段文法符号串,判断其是否为文法中的一个句子,辨别其是否符合语法规则。
例:
消除递归前: 消除递归后:
E->E+T E->TE’
E->T E’->+TE’|ε
T->T*F T-> F T’
T->F T’ ->*F T’|ε
F->(E)|I F→(E)|i
实验方法、步骤及结果测试
- 1. 源程序名:递归下降LL(1)文法分析程序.c
- 2.
可执行程序名:D:\\Debug\\递归下降LL(1)文法分析程序.exe
- 3. 原理分析及流程图
主要总体设计问题:
- 该用什么方式录入用户所输入的字符串。
2.该如何运用各个函数去分析语法
程序原理分析:
关键函数:getchar(); void input(); void input1(); void output();
4. 主要程序段及其解释:
char a[50] ,b[50],d[200],e[10]; char ch; int n1,i1=0,flag=1,n=5; int total=0; int E();// 功能识别函数 int E1();// 功能识别函数 int T();// 功能识别函数 int G();// 功能识别函数 int S();// 功能识别函数 int F();// 功能识别函数 void input();// 输入函数 void input1(); void output(); void main() { int f,p,j=0; char x; d[0]=\'E\'; d[1]=\'=\'; d[2]=\'>\'; d[3]=\'T\'; d[4]=\'G\'; d[5]=\'#\'; printf("请输入字符串(长度<50,以#号结束)\\n"); do{ scanf("%c",&ch); a[j]=ch; j++; }while(ch!=\'#\'); n1=j; ch=b[0]=a[0]; printf("步骤\\t文法\\t分析串\\t\\t分析字符\\t剩余串\\n"); f=E1(); if (f==0) return; if (ch==\'#\') { printf("accept\\n"); p=0; x=d[p]; while(x!=\'#\') { printf("%c",x);p=p+1;x=d[p]; } }else { printf("错误!\\n"); printf("回车返回\\n"); getchar(); getchar(); return; } printf("\\n"); printf("回车返回\\n"); getchar(); getchar(); } int E1() { int f,t; printf("%d\\tE-->TG\\t",total);total++; flag=1; input(); input1(); f=T(); if (f==0) return(0); t=G(); if (t==0) return(0); else return(1); } int E() { int f,t; printf("%d\\tE-->TG\\t",total);total++; 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); else return(1); } int T() { int f,t; printf("%d\\tT-->FS\\t",total);total++; 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); else return(1); } int G() { int f; if(ch==\'+\') { b[i1]=ch; printf("%d\\tG-->+TG\\t",total);total++; 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); G(); return(1); } printf("%d\\tG-->^\\t",total);total++; e[0]=\'G\';e[1]=\'=\';e[2]=\'>\';e[3]=\'^\';e[4]=\'#\'; output(); flag=1; input();input1(); return(1); } int S() { int f,t; if(ch==\'*\') { b[i1]=ch;printf("%d\\tS-->*FS\\t",total);total++; 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); else return(1);} printf("%d\\tS-->^\\t",total);total++; e[0]=\'S\';e[1]=\'=\';e[2]=\'>\';e[3]=\'^\';e[4]=\'#\'; output(); flag=1; a[i1]=ch; input();input1(); return(1); } int F() { int f; if(ch==\'(\') { b[i1]=ch;printf("%d\\tF-->(E)\\t",total);total++; 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("%d\\tF-->(E)\\t",total);total++; flag=0;input();input1(); ch=a[++i1]; } else { printf("error\\n"); return(0); } } else if(ch==\'i\') { b[i1]=ch;printf("%d\\tF-->i\\t",total);total++; e[0]=\'F\';e[1]=\'=\';e[2]=\'>\';e[3]=\'i\';e[4]=\'#\'; output(); flag=0;input();input1(); ch=a[++i1]; } else {printf("error\\n");return(0);} return(1); } void input() { int j=0; for (;j<=i1-flag;j++) printf("%c",b[j]); printf("\\t\\t"); printf("%c\\t\\t",ch); } void input1() { int j; for (j=i1+1-flag;j<n1;j++) printf("%c",a[j]); printf("\\n"); } void output(){ int m,k,j,q; int i=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]=\'#\'; system("暂停!"); }
5. 运行结果及分析:
二、 实验总结
心得体会:
这个是参考网上的一些内容,详细解读了LL 1文法,我对其进行了解读和修改,这个对LL(1)文法的理解有很好的帮助。
解决方案:1.查阅书籍。
2.向C语言厉害的同学请教。
3.网络搜索,看看别人是怎么写的。有没有值得参考的地方。
以上是关于实验 递归下降分析程序实验的主要内容,如果未能解决你的问题,请参考以下文章