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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

递归下降分析程序.docx

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. 对非

3、终结符E处理的函数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()这个函数主要是根据文

4、法中G-+TG|-TG|,在函数中调用了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;/读取当前

5、字符的下一个字符 if (f=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); /

6、表示当前分析字符可由非终结符T推导出 G();/判断当前分析字符是否是非终结符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-FS e0=T;e1=;e2=;e3

7、=F;e4=S;e5=#; Compute ();/推导式计算 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的处理很类似,将当然字符与该非终结符的每个候选式的第一个字符进行匹配。比如当然字符为

8、*,说明使用第一个候选式,然后调用F()和S()函数进行递归分析。如果当前字符为/,就使用第二个候选式,然后也调用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

9、=a+i1;/取出当前字符的下一个字符 f=F(); if (f=0) return(0); /如果当然分析字符可由非终结符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; /取出当前字符的

10、下一个字符 f=F();/如果当然分析字符可由非终结符F推出 if (f=0) return(0); t=S();/如果当然分析字符可由非终结符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

11、=ch; outDeduce ();/输出字符串 outputRemain ();/输出剩余字符 return(1);5.对非终结符F处理的函数F()函数主要是根据文法中给出的F-(E)|i ,在函数中调用E()。这个过程和前面对其他非终结符的处理差不多,都是根据候选式中涉及的非终结符调用相应的函数。将当前字符和每一个候选式的第一个字符进行匹配,比如如果当然字符是(,就使用第一个候选式,然后调用E()进行递归向下分析。如果当前字符是i,就使用第二个候选式。int F() int f; if(ch=() /当前字符是( bi1=ch;printf(F-(E)t);/说明使用的是第一个候选式 e0

12、=F;e1=;e2=;e3=(;e4=E;e5=);e6=#; Compute ();/推导式计算 flag=0; outDeduce ();/输出字符串 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)

13、; else if(ch=i) /当前字符是i bi1=ch;printf(F-it);/说明使用的是第二个候选式 e0=F;e1=;e2=;e3=i;e4=#; Compute ();/推导式计算 flag=0;outDeduce ();/输出字符串 outputRemain ();/输出剩余字符 ch=a+i1; else printf(errorn);return(0); return(1);四、测试结果这个程序测试时是往命令行中输入一串字符串,来判断该字符串是否是给出文法的一个句型,测试过程窗口中都详细给了出来。这次我测试的字符串是“i+i*i#”。截图如下:如果输入的字符串不是文法的一个句型,窗口中会显示error,说明输入的字符串不正确。这里我测试的字符串是“i+E”,截图如

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

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