ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:104.27KB ,
资源ID:6402506      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6402506.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(递归下降分析实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

递归下降分析实验报告.docx

1、递归下降分析实验报告实习二 递归下降分析一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。二、实验预习提示 1、递归下降分析法的功能词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。2、递归下降分析法的前提改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法,3、递归下降分析法实验设计思想及算法为G的每个非终结符号U构造一个递归过程,不妨命名为U。U的产生式的右边指出这个过程的代码结构:(1)若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。(2)若是非终

2、结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。具体为:(1)对于每个非终结符号U-u1|u2|un处理的方法如下:U( )ch=当前符号;if(ch可能是u1字的开头) 处理u1的程序部分;else if(ch可能是u2字的开头)处理u2的程序部分;else error()(2)对于每个右部u1-x1x2xn的处理架构如下:处理x1的程序;处理x2的程序;处理xn的程序;(3)如果右部为空,则不处理。(4)对于右部中的每个符号xi 如果xi为终结符号:if(xi= = 当前的符号) NextChar(); /% NextChar为前进一个字符函数。%/ re

3、turn; else 出错处理 如果xi为非终结符号,直接调用相应的过程xi()三、实验要求程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E-TG(2)G-+TG|TG|(3)T-FS(4)S-*FS|/FS|(5)F-(E)|i输出的格式如下:(1)输入一以#结束的符号串(包括+*/()i#):在此位置输入符号串例如:i+i*i# (2)输出结果:i+i*i#为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#; 2.如果遇到错误的表达式,应输出错误提示

4、信息(该信息越详细越好);3.学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。四、 实验内容4.1 功能描述这个程序是一个递归下降分析程序,能够判定输入的一个字符串是否属于给定的文法。如果不是,则会给出一定的出错信息,并且列出每一步使用的产生式。4.2 全局变量及其定义char a50;/-存储输入的字符串char ch; /-暂时存储输入的字符char d200;/-记录当前堆栈中的产生式int n1;/-输入字符串的长度char token;/-当前待分析字符4.3 模块设计int E();/-E过程,对应产生式E-TGint T();/-T过程,对应产生式T-FS

5、int G();/-G过程,对应产生式G-+TG|-TG|int S();/-S过程,对应产生式S-*FS|/FS|int F();/-F过程,对应产生式F-(E)|ivoid output();/-输出已分析字符串和当前字符void input1();/-输出剩余字符4.4 程序流程图图1 主函数main()流程图 图2 E函数()流程图 图3 T函数()流程图 图4 G函数()流程图图5 F函数()流程图图6 S函数()流程图五、核心代码清单:函数功能描述:根据文法E-TG,先从主函数开始调入第一个非终结符函数执行,并且显示调用产生式,根据程序的状态,调用非终结符函数T()或G(),进行递

6、归向下分析。int E() int f,t; printf(E-TGt); e0=E; e1=; e2=; e3=T; e4=G; e5=#; output(); flag=1; input(); input1(); f=T(); if (f=0) return(0); t=G(); if (t=0) return(0); else return(1);函数功能描述:根据文法G-+TG|TG|,如果当前字符变量ch 为“+”,则显示调用产生式,首先判断是算式递归向下分析是否结束,若没有结束则继续依次嵌套调用非终结符函数T()和G();如果当前字符变量ch 为“-”,则显示调用产生式,从文件文档

7、中读取下一个字符,让字符指针变量指向下一个字符,继续依次嵌套调用非终结符函数T()和G();如果当前字符变量ch 既不为“+” 也不为“-”,非终结符G 指向为空,函数只用于显示指向为空,找不到可以和文件中字符匹配的非终结符。int T() int f,t; printf(T-FSt); e0=T; e1=; e2=; e3=F; e4=S; e5=#; output(); flag=1; input(); input1(); f=F(); if (f=0) return(0); t=S(); if (t=0) return(0); else return(1);函数功能描述:根据文法T-FS

8、,先显示算式匹配所用的显示调用的产生式,然后依次嵌套调用非终结符函数F()和S(),进行递归向下分析。int G() int f; if(ch=+) bi1=ch; printf(G-+TGt); e0=G; e1=; e2=; e3=+; e4=T; e5=G; e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=T(); if (f=0) return(0); G(); return(1); if(ch=-) bi1=ch; printf(G-+TGt); e0=G; e1=; e2=; e3=+; e4=T; e5=G; e6=#;

9、 output(); flag=0; input(); input1(); ch=a+i1; f=T(); if (f=0) return(0); G(); return(1); printf(G-t); e0=G; e1=; e2=; e3=; e4=#; output(); flag=1; input(); input1();return(1);int S() int f,t; if(ch=*) bi1=ch; printf(S-*FSt); e0=S; e1=; e2=; e3=*; e4=F; e5=S; e6=#; output(); flag=0; input(); input1(

10、); ch=a+i1; f=F(); if (f=0) return(0); t=S(); if (t=0) return(0); else return(1); if(ch=/) bi1=ch; printf(S-*FSt); e0=S; e1=; e2=; e3=*; e4=F; e5=S; e6=#; 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(S-t); e0=S; e1=; e2=;

11、e3=; e4=#; output(); flag=1; ai1=ch; input(); input1(); return(1); printf(S-t); e0=S; e1=; e2=; e3=; e4=#; output(); flag=1; ai1=ch; input(); input1(); return(1);函数功能描述:根据文法S-*FS|/FS|,如果当前字符变量ch 为“*”,则显示调用产生式,从文件文档中读取下一个字符,让字符指针变量指向下一个字符,依次嵌套调用非终结符函数F()和递归调用自身S();如果当前字符变量ch 为“/”,则显示调用产生式,从文件文档中读取下一个

12、字符,让字符指针变量指向下一个字符,依次嵌套调用非终结符函数F()和递归调用自身S();如果当前字符变量ch 既不为“*” 也不为“/”,G 中找不到可以匹配的算式则非终结符G 指向为空。int F() int f; if(ch=() bi1=ch; printf(F-(E)t); e0=F; e1=; e2=; e3=(; e4=E; e5=); e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=E(); if (f=0) return(0); if(ch=) bi1=ch; printf(F-(E)t); flag=0; input

13、(); input1(); ch=a+i1; else printf(errorn); return(0); else if(ch=i) bi1=ch; printf(F-it); e0=F; e1=; e2=; e3=i; e4=#; output(); flag=0; input(); input1(); ch=a+i1; else printf(errorn); return(0); return(1);void input() int j=0; for (; j=i1-flag; j+) printf(%c,bj); /*输出分析串*/ printf(tt); printf(%ctt,

14、ch); /*输出分析字符*/void input1() int j; for (j=i1+1-flag; jn1; j+) printf(%c,aj); /*输出剩余字符*/ printf(n);六、程序运行结果:七、实验中遇到的问题:因为前面的好多实习,都是用JAVA编程实现老师规定的任务,所以对C语言的编程有点淡忘了。于是,这次决定用C语言编程实现,以巩固我的C语言编程能力。在这次实习的过程中,遇到了很多问题。最令我印象深刻的是内存分配问题上。因为在JAVA中不涉及手动分配内存的问题,而在C语言中对于数组等变量要手动分配内存。所以,在实习中,总是忘了手动分配内存,出现内存读写错误。于是,

15、经过一步一步的Debug后,发现了问题的所在。还有一个问题是:在添加打印出分析栈内容的时候,打印出来的分析栈内容与自己的预期很不吻合,经过调试才发现在匹配成功后,没有返回1,然后就程序只能接着执行后面的语句,所以导致分析错误。八、实验总结:通过这次实习,不仅使我对递归下降分析过程有了更进一步的了解,而且使我对C语言的编程进行了温习。这次实验前,花了一个半小时理解书中的理论并且自己在纸上模拟了一遍分析过程。递归下降分析就是对每个非终结符按其产生式结构来构造相应语法分析子程序,其中终结符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归

16、下降法。有了前面的基础,在编程的时候对程序流程就比较熟悉了。花了一个半小时来设计程序,用了两个小时的时间调试上面出现的错误。通过这次实验,对递归下降分析程序的设计方法有了更深的理解,同时,也提高了自己的程序设计能力和调试技巧。总之,这次实习,我收获很大。九、完整代码:#include#include#include#includechar a50 ,b50,d200,e10;char ch;int n1,i1=0,flag=1,n=5;int E();int E1();int T();int G();int S();int F();void input();void input1();void

17、 output();int main() /*递归分析*/ int f,p,j=0; char x; d0=E; d1=; d2=; d3=T; d4=G; d5=#; printf(n请输入字符串(长度TGt); 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(E-TGt); e0=E; e1=; e2=; e3=T; e4=G; e5=#; output(); flag=1; input(); inp

18、ut1(); 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=#; 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=+) bi1=ch; printf(G-+TGt); e0=G

19、; e1=; e2=; e3=+; e4=T; e5=G; e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=T(); if (f=0) return(0); G(); return(1); if(ch=-) bi1=ch; printf(G-+TGt); e0=G; e1=; e2=; e3=+; e4=T; e5=G; e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=T(); if (f=0) return(0); G(); return(1); printf(G-t);

20、e0=G; e1=; e2=; e3=; e4=#; output(); flag=1; input(); input1(); return(1);int S() int f,t; if(ch=*) bi1=ch; printf(S-*FSt); e0=S; e1=; e2=; e3=*; e4=F; e5=S; e6=#; 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); if(ch=/) bi1=ch; pri

21、ntf(S-*FSt); e0=S; e1=; e2=; e3=*; e4=F; e5=S; e6=#; 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(S-t); e0=S; e1=; e2=; e3=; e4=#; output(); flag=1; ai1=ch; input(); input1(); return(1); printf(S-t); e0=S; e1=; e2=; e3=; e

22、4=#; output(); flag=1; ai1=ch; input(); input1(); return(1);int F() int f; if(ch=() bi1=ch; printf(F-(E)t); e0=F; e1=; e2=; e3=(; e4=E; e5=); e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=E(); if (f=0) return(0); if(ch=) bi1=ch; printf(F-(E)t); flag=0; input(); input1(); ch=a+i1; else printf

23、(errorn); return(0); else if(ch=i) bi1=ch; printf(F-it); e0=F; e1=; e2=; e3=i; e4=#; output(); flag=0; input(); input1(); ch=a+i1; else printf(errorn); return(0); return(1);void input() int j=0; for (; j=i1-flag; j+) printf(%c,bj); /*输出分析串*/ printf(tt); printf(%ctt,ch); /*输出分析字符*/void input1() int j; for (j=i1+1-flag; jn1; j+) printf(%c,a

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1