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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译课程设计递归下降语法分析.docx

1、编译课程设计递归下降语法分析课程名称 编译原理 设计题目 递归下降语法分析 一、 设计目的通过设计、编制、调试一个具体的语法分析程序,加深对语法分析原理的理解,加深对语法及语义分析原理的理解,并实现对文法的判断,是算符优先文法的对其进行FirstVT集及LastVT集的分析,并对输入的字符串进行规约输出规约结果成功或失败。二、 设计内容及步骤 内容:在C+ 6.0中编写程序代码实现语法分析功能,调试得到相应文法的判断结果:是算符优先或不是。若是,则输出各非终结符的FirstVT与LastVT集的结果,还可进行字符串的规约,输出详细的规约步骤,程序自动判别规约成功与失败。步骤:1.看书,找资料,

2、了解语法分析器的工作过程与原理 2.分析题目,列出基本的设计思路 定义栈,进栈,出栈函数 栈为空时的处理 构造函数判断文法是否是算符文法,算符优先文法 构造FirstVT和LastVT函数对文法的非终结符进行分析 是算符优先文法时,构造函数对其可以进行输入待规约串,输出规约结果 构造主函数,对过程进行分析 3.上机实践编码,将设计的思路转换成C+语言编码,编译运行 4.测试,输入不同的文法,观察运行结果三、 详细的算法描述详细设计伪代码如下:首先要声明变量,然后定义各个函数1.void Initstack(charstack &s)/定义栈s.base=new charLode20; s.to

3、p=-1; 2. void push(charstack &s,charLode w)/字符进栈 s.top+; s.bases.top.E=w.E; s.bases.top.e=w.e;3. void pop(charstack &s,charLode &w)/字符出栈 w.E=s.bases.top.E; w.e=s.bases.top.e; s.top-;4. int IsEmpty(charstack s)/判断栈是否为空if(s.top=-1) return 1;else return 0;5.int IsLetter(char ch)/判断是否为非终结符 if(ch=A&ch=Z)

4、 return 1; else return 0;6.int judge1(int n) /judge1是判断是否是算符文法:若产生式中含有两个相继的非终结符则不是算符文法7. void judge2(int n)/judge2是判断文法G是否为算符优先文法:若不是算符文法或若文法中含空字或终结符的优先级不唯一则不是算符优先文法8.int search1(char r,int kk,char a) /search1是查看存放终结符的数组r中是否含有重复的终结符9.void createF(int n) /createF函数是用F数组存放每个终结符与非终结符和组合,并且值每队的标志位为0;F数组

5、是一个结构体10.void search(charLode w) /search函数是将在F数组中寻找到的终结符与非终结符对的标志位值为1 分情况讨论:/产生式的后选式的第一个字符就是终结符的情况/产生式的后选式的第一个字符是非终结符的情况11.void LastVT(int n) /求LastVT12.void FirstVT(int n) /求FirstVT13.void createYXB(int n) /构造优先表分情况讨论:/优先级等于的情况,用1值表示等于/优先级小于的情况,用2值表示小于/优先级大于的情况,用3值表示大于14.int judge3(char s,char a)/j

6、udge3是用来返回在归约过程中两个非终结符相比较的值15.void print(char s,char STR20,int q,int u,int ii,int k) /打印归约的过程16. void process(char STR20,int ii) /对输入的字符串进行归约的过程四、 设计结果分两大类,四种不同的情况第一类情况:产生式的候选式以终结符开始候选式以终结符开始经过存在递归式的非终结符后再以终结符结束 第二类情况:产生式的候选式是两个或以上的非终结符 五、设计总结与心得通过对语法分析的实践操作,对它在实践中的应用有了更深刻的理解,通过上机实践,提高了从错误中分析问题,解决问题

7、的能力。在实践的基础上,把所学的知识得到了实际应用,通过本次的编译原理课程设计,让我对用C+编程的大致思路又进行了一次回顾,设计一个可运行的程序代码的思路规范,声明变量,定义各大需要调用的函数及其调用。在这个实验的过程中,如何运用栈,指针来达到判断是否是算符优先文法的规约的目的,当然其中也设计了多个供调用的函数,声明了多个变量,锻炼了思维逻辑能力,同时在和同学的探讨下锻炼了我的发现问题分析问题的能力。六、程序完整代码#include#include#includetypedef structchar R;char r;int flag;array;typedef struct char E;c

8、har e;charLode;typedef struct charLode *base; int top;charstack;char str8080,arr8080,brr8080;array F20;int m,kk,p,ppp,FF=1;char r10;int crr2020,FLAG=0;char ccrr1120,ccrr2201;void Initstack(charstack &s)s.base=new charLode20; s.top=-1;void push(charstack &s,charLode w) s.top+; s.bases.top.E=w.E; s.ba

9、ses.top.e=w.e;void pop(charstack &s,charLode &w) w.E=s.bases.top.E; w.e=s.bases.top.e; s.top-;int IsEmpty(charstack s)if(s.top=-1) return 1;else return 0;int IsLetter(char ch) if(ch=A&ch=Z) return 1; else return 0;int judge1(int n)int j=3,flag=0;for(int i=0;i=n;i+) while(strij!=0) char a=strij; char

10、 b=strij+1; if(IsLetter(a)&IsLetter(b) flag=1;break;else j+; if(flag=1) return 0; else return 1;void judge2(int n)for(int i=0;i=n;i+) if(stri3=|judge1(n)=0|FLAG=1)/代表空字 cout文法G不是算符优先文法!n) cout文法G是算符优先文法!endl;int search1(char r,int kk,char a)for(int i=0;ikk;i+) if(ri=a) break; if(i=kk) return 0; else

11、 return 1;void createF(int n)int k=0,i=1;char g;char t10;/t数组用来存放非终结符t0=str00;while(i=n) if(tk!=stri0) k+;tk=stri0;g=tk;i+; else i+;kk=0; char c;for(i=0;i=n;i+) int j=3; while(strij!=0) c=strij; if(IsLetter(c)=0) if(!search1(r,kk,c) rkk=c;kk+;/r数组用来存放终结符 j+; m=0;for(i=0;ik;i+) for(int j=0;jkk-1;j+)

12、Fm.R=ti; Fm.r=rj; Fm.flag=0; m+; void search(charLode w)for(int i=0;im;i+) if(Fi.R=w.E&Fi.r=w.e) Fi.flag=1;break;void FirstVT(int n) charstack sta;charLode w;int i=0;Initstack(sta);while(i=n) int k=3; w.E=stri0; char a=strik; char b=strik+1; if(!IsLetter(a) w.e=a; push(sta,w); search(w); i+; else if

13、(IsLetter(a)&b!=0&!IsLetter(b) w.e=b; push(sta,w); search(w); i+; else i+;charLode ww;while(!IsEmpty(sta) pop(sta,ww); for(i=0;i=n;i+) w.E=stri0; if(stri3=ww.E&stri4=0) w.e=ww.e; push(sta,w); search(w); break; p=0;int k=1;i=1;while(im) if(Fi-1.flag=1) arrp0=Fi-1.R; arrpk=Fi-1.r; while(Fi.flag=0&im)

14、i+; if(Fi.flag=1) if(Fi.R=arrp0) k+; else arrpk+1=0;p+;k=1; i+; void LastVT(int n)charstack sta;charLode w;for(int i=0;im;i+) Fi.flag=0;i=0;Initstack(sta);while(i=n) int k=strlen(stri); w.E=stri0; char a=strik-1; char b=strik-2; if(!IsLetter(a) w.e=a; push(sta,w); search(w); i+; else if(IsLetter(a)&

15、!IsLetter(b) w.e=b; push(sta,w); search(w); i+; else i+;charLode ee;while(!IsEmpty(sta) pop(sta,ee); for(i=0;i=n;i+) w.E=stri0; if(stri3=ee.E&stri4=0) w.e=ee.e; push(sta,w); search(w); int k=1;i=1;ppp=0;while(im) if(Fi-1.flag=1) brrppp0=Fi-1.R; brrpppk=Fi-1.r; while(Fi.flag=0&im) i+; if(Fi.flag=1) i

16、f(Fi.R=arrppp0) k+; else brrpppk+1=0;ppp+;k=1; i+; void createYXB(int n)int i,j; for(j=1;j=kk;j+) ccrr10j=rj-1;for( i=1;i=kk;i+) ccrr2i0=ri-1;for(i=1;i=kk;i+) for(j=1;j=kk;j+) crrij=0; int I=0,J=3; while(I=n) if(strIJ+1=0) I+;J=3; else while(strIJ+1!=0) char aa=strIJ; char bb=strIJ+1; if(!IsLetter(a

17、a)&!IsLetter(bb) for(i=1;i=kk;i+) if(ccrr2i0=aa) break; for(j=1;j=kk;j+) if(ccrr10j=bb) break; if(crrij=0) crrij=1; else FLAG=1;I=n+1; J+; if(!IsLetter(aa)&IsLetter(bb)&strIJ+2!=0&!IsLetter(strIJ+2) for(i=1;i=kk;i+) if(ccrr2i0=aa) break; for(int j=1;j=kk;j+) if(ccrr10j=strIJ+2) break; if(crrij=0) cr

18、rij=1; else FLAG=1;I=n+1; if(!IsLetter(aa)&IsLetter(bb) for(i=1;i=kk;i+) if(aa=ccrr2i0) break; for(j=0;j=p;j+) if(bb=arrj0) break; for(int mm=1;arrjmm!=0;mm+) for(int pp=1;pp=kk;pp+) if(ccrr10pp=arrjmm) break; if(crripp=0) crripp=2; else FLAG=1;I=n+1; J+; if(IsLetter(aa)&!IsLetter(bb) for(i=1;i=kk;i

19、+) if(ccrr10i=bb) break; for(j=0;j=ppp;j+) if(aa=brrj0) break; for(int mm=1;brrjmm!=0;mm+) for(int pp=1;pp=kk;pp+) if(ccrr2pp0=brrjmm) break; if(crrppi=0) crrppi=3; else FLAG=1;I=n+1; J+; int judge3(char s,char a)int i=1,j=1;while(ccrr2i0!=s) i+; j+;if(crrij=3) return 3;while(ccrr10j!=a)else if(crri

20、j=2) return 2;else if(crrij=1) return 1;else return 0;void print(char s,char STR20,int q,int u,int ii,int k) coutu ;for(int i=0;i=k;i+) coutsi;cout ;for(i=q;i=ii;i+) coutSTR0i;cout ;void process(char STR20,int ii)/对输入的字符串进行归约的过程 cout步骤 符号栈 输入串 动作endl;int k=0,q=0,u=0,b,i,j;char s40,a;sk=#;print(s,STR

21、,q,u,ii,k);cout预备endl;k+;u+; sk=STR0q;q+;print(s,STR,q,u,ii,k);cout移进endl;while(q=ii) a=STR0q; if(!IsLetter(sk) j=k; else j=k-1; b=judge3(sj,a); if(b=3)/大于的情况进行归约 while(IsLetter(sj-1) j-; for(i=j;i=k;i+) si=0; k=j;sk=N;u+; print(s,STR,q,u,ii,k); cout归约endl; else if(b=2|b=1)/小于或等于的情况移进 k+; sk=a; u+;

22、q+; print(s,STR,q,u,ii,k); if(s0=#&s1=N&s2=#) cout接受endl; else cout移进endl; else cout出错endl;break;if(s0=#&s1=N&s2=#) cout归约成功endl;else cout归约失败endl;void main()int n,i,j;coutn;for(i=0;i;stri3=#;stri4=str00;stri5=#; stri6=0;cout你定义的产生式如下:endl; for(i=0;i=n;i+) coutstriendl;if(judge1(n)=0)/判断文法G是否为算符文法 c

23、out文法G不是算符文法!endl;if(judge1(n)=1)cout文法G是算符文法!endl; createF(n);FirstVT(n);LastVT(n);createYXB(n);judge2(n);/判断文法G是否为算符优先文法 if(FLAG=0) for(i=0;i=p;i+)/打印FirstVT coutFirstVT(arri0)=; for(int l=1;arril+1!=0;l+) coutarril,; coutarrilendl; coutFirstVT(Q)=#endl; for(i=0;i=ppp;i+)/打印LastVT coutLastVT(arri0

24、)=; for(int l=1;brril+1!=0;l+) coutbrril,; coutbrrilendl; coutLastVT(Q)=#endl; cout优先表如下:endl; for(i=1;ikk;i+)/打印优先关系表 cout ; coutccrr10i; coutendl; for(i=1;ikk;i+) coutccrr2i0 ; for(j=1;jkk;j+) if(crrij=0) cout ; else if(crrij=1) cout=; else if(crrij=2) cout; else if(crrij=3) cout; cout ; coutendl;

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

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