版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。二、程序算法描述这次的实习主要是根据以下文法实现一个递归下降分析器,依据文法如下:(1)e-tg(2)g-+tg|tg|(3)t-fs(4)s-*fs|/fs|(5)f-(e)|i在这个递归下降分析器程序中每一个非终结符e、g、t、s和f构造相应的递归函数,函数的名字表示文法左部的非终结符,函数中就是按文法中每个非终结符右部的候选式依次进行匹配,根据对输入串的分析如果非终结符可以用其中的一个候选式替代就返回1,否则返回0。因为该文法中有五个非终结符,所以定义了五
2、个函数,分别为e(),g(),t(),s()和f()。当输入一串字符串后,就对该字符串进行分析,首先从开始符号分析,所以首先调用e()函数,在e()函数中会调用t()和g(),就是每个非终结符的候选式中出现了哪个非终结符就调用哪个函数。所以,将字符串的第一个字符和e中的每个候选式匹配,如果成功就匹配输入字符串的下一个字符,当最后剩下的字符为#时,匹配成功。其实这个工程就是构造一个语法树。 程序总流程图如下:图1 程序总流程图三、关键性代码这个工程的主要工作用五个非终结符生成的句子是否和输入字符串匹配,所以主要的工作是函数e(),g(),t(),s()和f()的编写。1. 对非终结符e处理的函数
3、e()这个函数主要是根据文法中的e-tg,在e()中调用了t()和g()来进行递归分析,这个就是构造生成树的一个分支。 int e() int f,t;/变量printf(e-tgt);/输出根据的文法 flag=1; outdeduce ();/输出字符串 outputremain ();/输出剩余字符f=t();if (f=0) return(0); /表示当前分析字符可由非终结符t推导出t=g(); if (t=0) return(0); /表示当前分析字符可由非终结符g推导出else return(1);2. 对非终结符g处理的函数g()这个函数主要是根据文法中g-+tg|-tg|,在
4、函数中调用了t()和g()函数。将当前字符和候选式的第一个字符进行匹配,如果匹配成功,就调用该候选式中涉及到得第一个非终结符对应的函数,一次递归嵌套调用。如果不是由第一个候选式推出然后依次匹配剩下的候选式。int g() int f; if(ch=+) /当前字符式+ bi1=ch; printf(g-+tgt);/说明用的是第一个候选式e0=g;e1=;e2=;e3=+;e4=t;e5=g;e6=#; compute ();/计算推导式 flag=0;outdeduce ();/输出字符串 outputremain ();/输出剩余字符 ch=a+i1;/读取当前字符的下一个字符 if (f
5、=0) return(0); /表示当前分析字符可由非终结符t推导出 t=g(); if (t=0) return(0); /表示当前分析字符可由非终结符g推导出 if(ch=-) /当前字符是-bi1=ch;printf(g-+tgt);/说明用的是第二个候选式e0=g;e1=;e2=;e3=+;e4=t;e5=g;e6=#; compute();/输出推导式 flag=0;outdeduce ();/输出字符串 outputremain ();/输出剩余字符ch=a+i1;/读取当前字符的下一个字符f=t();if (f=0) return(0); /表示当前分析字符可由非终结符t推导出g
6、();/判断当前分析字符是否是非终结符g的一个产生式return(1);printf(g-t);e0=g;e1=;e2=;e3=;e4=#;compute ();/推导式计算flag=1;outdeduce ();/输出字符串 outputremain ();/输出剩余字符 return(1);3.对非终结符t处理的函数t()函数主要是根据文法中的t-fs,在函数中调用f()和s(),进行递归分析,也是构造语法树的一个分支。int t() int f,t;printf(t-fst);/说明所用的推导式是t-fse0=t;e1=;e2=;e3=f;e4=s;e5=#; compute ();/推
7、导式计算flag=1;outdeduce ();/输出字符串outputremain ();/输出剩余字符f=f();if (f=0) return(0);/表示当前分析字符可由非终结符f推导出t=s();/表示当前分析字符可由非终结符s推导出if (t=0) return(0);else return(1);4. 对非终结符s处理的函数s()函数的主要是文法要求s-*fs|/fs|,在函数中调用f()和s()函数。其实这个过程和对非终结符g的处理很类似,将当然字符与该非终结符的每个候选式的第一个字符进行匹配。比如当然字符为*,说明使用第一个候选式,然后调用f()和s()函数进行递归分析。如果
8、当前字符为/,就使用第二个候选式,然后也调用f()和s()函数进行递归分析。如果当前字符是在和g中的任何一个候选式的第一个字符都不匹配,就返回1,说明当然字符不能由非终结符g推出。int s()int f,t;if(ch=*) /当前字符是*bi1=ch;printf(s-*fst);/说明使用的是第一个候选式e0=s;e1=;e2=;e3=*;e4=f;e5=s;e6=#;compute ();/推导式计算flag=0;outdeduce ();/输出字符串 outputremain ();/输出剩余字符ch=a+i1;/取出当前字符的下一个字符f=f();if (f=0) return(0
9、); /如果当然分析字符可由非终结符f推出t=s();if (t=0) return(0); /如果当然分析字符可由非终结符s推出 else return(1);if(ch=/) /当前字符是/bi1=ch;printf(s-*fst);/说明使用的是第二个候选式e0=s;e1=;e2=;e3=*;e4=f;e5=s;e6=#;compute ();/推导式计算flag=0;outdeduce ();/输出字符串 outputremain ();/输出剩余字符ch=a+i1; /取出当前字符的下一个字符f=f();/如果当然分析字符可由非终结符f推出if (f=0) return(0);t=s
10、();/如果当然分析字符可由非终结符s推出if (t=0) return(0);else return(1); printf(s-t); e0=s;e1=;e2=;e3=;e4=#; compute ();/推导式计算 flag=1; ai1=ch; outdeduce ();/输出字符串 outputremain ();/输出剩余字符 return(1); printf(s-t); e0=s;e1=;e2=;e3=;e4=#; output();/推导式计算 flag=1; ai1=ch; outdeduce ();/输出字符串 outputremain ();/输出剩余字符 return(
11、1);5.对非终结符f处理的函数f()函数主要是根据文法中给出的f-(e)|i ,在函数中调用e()。这个过程和前面对其他非终结符的处理差不多,都是根据候选式中涉及的非终结符调用相应的函数。将当前字符和每一个候选式的第一个字符进行匹配,比如如果当然字符是(,就使用第一个候选式,然后调用e()进行递归向下分析。如果当前字符是i,就使用第二个候选式。int f() int f; if(ch=() /当前字符是(bi1=ch;printf(f-(e)t);/说明使用的是第一个候选式 e0=f;e1=;e2=;e3=(;e4=e;e5=);e6=#;compute ();/推导式计算flag=0;ou
12、tdeduce ();/输出字符串 outputremain ();/输出剩余字符ch=a+i1;/读取下一个字符f=e();if (f=0) return(0); /如果当然分析字符可由非终结符e推出if(ch=) /当前字符是)bi1=ch;printf(f-(e)t);/说明使用的是第一个候选式 flag=0;outdeduce ();/输出字符串 input1();/输出剩余字符ch=a+i1;else printf(errorn);return(0); else if(ch=i) /当前字符是ibi1=ch;printf(f-it);/说明使用的是第二个候选式e0=f;e1=;e2=
13、;e3=i;e4=#;compute ();/推导式计算flag=0;outdeduce ();/输出字符串 outputremain ();/输出剩余字符ch=a+i1; else printf(errorn);return(0); return(1);四、测试结果这个程序测试时是往命令行中输入一串字符串,来判断该字符串是否是给出文法的一个句型,测试过程窗口中都详细给了出来。这次我测试的字符串是“i+i*i#”。截图如下:如果输入的字符串不是文法的一个句型,窗口中会显示error,说明输入的字符串不正确。这里我测试的字符串是“i+e”,截图如下:五、实习总结这是编译原理的第二次实习,这次的实
14、习主要是实现一个递归下降分析器,主要就是根据一个文法,判断用户输入的字符串是否是该文法的一个句型。这个实现的过程形象点就是构造一个语法树,从开始字符开始,将输入字符串的第一个字符与文法中的非终结符的每个候选式的第一个字符进行匹配,成功后匹配下一个字符,直到字符串的所有字符都能匹配上。这次的实习的过程让我想起了数据结构上学到的树的构建,实现的代码有的地方也参照了网上的程序,实现的过程中出现了很多错误,总之,最后还是实现了。实习中出现的错误有的是将过程没有分析完整,也有的语法出现了错误,自己也请教了同学。通过这次的实习,自己对递归下降分析有了深入的认识,其实课本上的知识自己看的很简单,但是实现的过
15、程是很麻烦的,自己以后也会多多练习。附录:总程序:#include #include#include#includechar a50 ,b50,d200,e10;/a存放输入的字符串char ch;int n1,i1=0,flag=1,n=5;int e();int t();int g();int s();int f();void outdeduce();void outputremain();void compute();void main()/*递归分析*/ int f,p,j=0; char x; d0=e; d1=; d2=; d3=t; d4=g; d5=#; printf(*递归下
16、降分析器*n); printf(请输入字符串(以#号结束)n); do scanf(%c,&ch); aj=ch; j+; while(ch!=#); n1=j; ch=b0=a0; printf(文法t分析串tt分析字符t剩余串n); f=e(); if (f=0) return; if (ch=#) printf(输入字符串正确n); p=0; x=dp; else printf(errorn); getchar(); getchar(); return; printf(n); getchar(); getchar();int e() int f,t; printf(e-tgt); fla
17、g=1; outdeduce();/输出分析串 outputremain();/输出剩余字符 f=t(); if (f=0) return(0); t=g(); if (t=0) return(0); else return(1);int t() int f,t; printf(t-fst); e0=t; e1=; e2=; e3=f; e4=s; e5=#; compute(); flag=1; outdeduce(); outputremain(); f=f(); if (f=0) return(0); t=s(); if (t=0) return(0); else return(1);i
18、nt g() int f; if(ch=+) bi1=ch; printf(g-+tgt); e0=g; e1=; e2=; e3=+; e4=t; e5=g; e6=#; compute(); flag=0; outdeduce(); outputremain(); ch=a+i1; f=t(); if (f=0) return(0); g(); return(1); printf(g-t); e0=g; e1=; e2=; e3=; e4=#; compute(); flag=1; outdeduce(); outputremain(); return(1);int s() int f,t
19、; if(ch=*) bi1=ch; printf(s-*fst); e0=s; e1=; e2=; e3=*; e4=f; e5=s; e6=#; compute(); flag=0; outdeduce(); outputremain(); ch=a+i1; f=f(); if (f=0) return(0); t=s(); if (t=0) return(0); else return(1); printf(s-t); e0=s; e1=; e2=; e3=; e4=#; compute(); flag=1; ai1=ch; outdeduce(); outputremain(); return(1);int f() int f; if(ch=() bi1=ch; printf(f-(e)t); e0=f; e1=; e2=; e3=(; e4=e; e5=); e6=#; compute(); flag=0; outdeduce(); outputremain(); ch=a+i1; f=e(); if (f=0) return(0); if(ch=) bi1=ch;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年湖北省高中信息技术第11章数据结构与算法课件
- 云南省昆明市东川区东川第二中学2026-2027学年八上语文期中检测卷(含答案)
- 2026年数控操作技术模拟试题(含答案)
- 2026年静疗竞赛模拟试题(含答案)
- 2026年泉州市护理模拟试题(含答案)
- 2026年辽宁汉语文模拟试题(含答案)
- 2026年往届二外法语模拟试题(含答案)
- 2026-2030年中国汽车线控系统行业竞争态势与盈利前景预测报告
- 2026年微机接口技术模拟试题(含答案)
- 2026年水土保持模拟试题(含答案)
- 部编版五年级上册语文第七单元《习作:我最喜爱的季节》教学课件(新教材)
- 汽车毫米波雷达工程师考试试卷及答案
- 文学概论讲义
- 河南警察学院引进高层次人才考核办法(试行)
- 老年人精神障碍与护理
- 2026年洗发水中国功效洗护生态趋势报告
- 2026年6月英语A级试卷及答案
- DB54∕T 0617-2026 民用供氧工程设计标准
- 2026年中铝集团校园招聘笔试
- 2025年员工离职交接表模板
- 人工挖孔灌注桩施工应急预案
评论
0/150
提交评论