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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译课程设计递归下降语法分析Word文档下载推荐.docx

1、 s.top-;4. int IsEmpty(charstack s)/判断栈是否为空if(s.top=-1) return 1;else return 0;5.int IsLetter(char ch)/判断是否为非终结符 if(ch=A&chZ) else return 0;6.int judge1(int n) /judge1是判断是否是算符文法:若产生式中含有两个相继的非终结符则不是算符文法7. void judge2(int n)/judge2是判断文法G是否为算符优先文法:若不是算符文法或若文法中含空字或终结符的优先级不唯一则不是算符优先文法8.int search1(char r

2、,int kk,char a) /search1是查看存放终结符的数组r中是否含有重复的终结符9.void createF(int n) /createF函数是用F数组存放每个终结符与非终结符和组合,并且值每队的标志位为0;F数组是一个结构体10.void search(charLode w) /search函数是将在F数组中寻找到的终结符与非终结符对的标志位值为1 分情况讨论:/产生式的后选式的第一个字符就是终结符的情况/产生式的后选式的第一个字符是非终结符的情况11.void LastVT(int n) /求LastVT12.void FirstVT(int n) /求FirstVT13.

3、void createYXB(int n) /构造优先表/优先级等于的情况,用1值表示等于/优先级小于的情况,用2值表示小于/优先级大于的情况,用3值表示大于14.int judge3(char s,char a)/judge3是用来返回在归约过程中两个非终结符相比较的值15.void print(char s,char STR20,int q,int u,int ii,int k) /打印归约的过程16. void process(char STR20,int ii) /对输入的字符串进行归约的过程四、 设计结果分两大类,四种不同的情况第一类情况:产生式的候选式以终结符开始候选式以终结符开始

4、经过存在递归式的非终结符后再以终结符结束 第二类情况:产生式的候选式是两个或以上的非终结符五、设计总结与心得通过对语法分析的实践操作,对它在实践中的应用有了更深刻的理解,通过上机实践,提高了从错误中分析问题,解决问题的能力。在实践的基础上,把所学的知识得到了实际应用,通过本次的编译原理课程设计,让我对用C+编程的大致思路又进行了一次回顾,设计一个可运行的程序代码的思路规范,声明变量,定义各大需要调用的函数及其调用。在这个实验的过程中,如何运用栈,指针来达到判断是否是算符优先文法的规约的目的,当然其中也设计了多个供调用的函数,声明了多个变量,锻炼了思维逻辑能力,同时在和同学的探讨下锻炼了我的发现

5、问题分析问题的能力。六、程序完整代码#includestring.hstdio.htypedef structchar R;char r;int flag;array;typedef struct char E;char e;charLode; 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)void

6、push(charstack &void pop(charstack &int IsEmpty(charstack s)int IsLetter(char ch)int judge1(int n)int j=3,flag=0;for(int i=0;i=n;i+) while(strij!0 char a=strij; char b=strij+1; if(IsLetter(a)&IsLetter(b) flag=1;break;else j+; if(flag=1) return 0; elsevoid judge2(int n) if(stri3=|judge1(n)=0|FLAG=1)/

7、代表空字 coutn) cout文法G是算符优先文法!int search1(char r,int kk,char a)kk; if(ri=a) break; if(i=kk) return 0; else 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; int j=3; c=strij; if(IsLetter(c)=0) if(!sea

8、rch1(r,kk,c) rkk=c;kk+;/r数组用来存放终结符 j+;m=0;k; for(int j=0;jkk-1;j+) Fm.R=ti; Fm.r=rj; Fm.flag=0; m+;void search(charLode w)m; if(Fi.R=w.E&Fi.r=w.e) Fi.flag=1;void FirstVT(int n) charstack sta;charLode w;int i=0;Initstack(sta); int k=3; w.E=stri0; char a=strik; char b=strik+1;IsLetter(a) w.e=a; push(s

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

10、Fi.flag=0;i=0; int k=strlen(stri); char a=strik-1; char b=strik-2;IsLetter(a)charLode ee; pop(sta,ee); if(stri3=ee.E& w.e=ee.e;ppp=0; brrppp0=Fi-1.R; brrpppk=Fi-1.r; if(Fi.R=arrppp0) else brrpppk+1=ppp+;void createYXB(int n)int i,j; for(j=1;=kk; ccrr10j=rj-1;for( i=1; ccrr2i0=ri-1;for(i=1; crrij=0;

11、int I=0,J=3; while(I if(strIJ+1= I+;J=3; while(strIJ+1! char aa=strIJ; char bb=strIJ+1;IsLetter(aa)&IsLetter(bb) for(i=1; if(ccrr2i0=aa) if(ccrr10j=bb) if(crrij=0) crrij=1; else FLAG=1;I=n+1; J+;IsLetter(bb)&strIJ+2!IsLetter(strIJ+2) for(int j=1; if(ccrr10j=strIJ+2)IsLetter(bb) if(aa=ccrr2i0) for(j=

12、0;=p; if(bb=arrj0) for(int mm=1;arrjmm!mm+) for(int pp=1;pppp+) if(ccrr10pp=arrjmm) if(crripp=0) crripp=2; if(IsLetter(aa)& if(ccrr10i=bb)=ppp; if(aa=brrj0)brrjmm! if(ccrr2pp0=brrjmm) if(crrppi=0) crrppi=3;int judge3(char s,char a)int i=1,j=1;while(ccrr2i0!=s)if(crrij=3) return 3;while(ccrr10j!=a)el

13、se if(crrij=2) return 2;else if(crrij=1)void print(char s,char STR20,int q,int u,int ii,int k) coutu =k;si;for(i=q;=ii;STR0i;void process(char STR20,int ii)/对输入的字符串进行归约的过程 步骤符号栈输入串动作int k=0,q=0,u=0,b,i,j;char s40,a;sk=#print(s,STR,q,u,ii,k);预备k+;u+; sk=STR0q;q+;移进while(q=ii) a=STR0q;IsLetter(sk) j=k

14、; else j=k-1; b=judge3(sj,a); if(b=3)/大于的情况进行归约 while(IsLetter(sj-1) j-; for(i=j; si= k=j;N print(s,STR,q,u,ii,k);归约 else if(b=2|b=1)/小于或等于的情况移进 sk=a; u+; q+; if(s0=s1=s2=接受 else cout else 出错if(s0=归约成功else coutn; gets(stri); j=strlen(stri); strij=stri0=Qstri1=-stri2=stri3=stri4=str00;stri5= stri6=你定

15、义的产生式如下:striif(judge1(n)=0)/判断文法G是否为算符文法文法G不是算符文法!if(judge1(n)=1)文法G是算符文法! createF(n);FirstVT(n);LastVT(n);createYXB(n);judge2(n);/判断文法G是否为算符优先文法 if(FLAG=0)i+)/打印FirstVTFirstVT(arri0)= for(int l=1;arril+1!l+)arril,FirstVT(Q)=#i+)/打印LastVTLastVT(brril+1!brrilLastVT(Q)=#优先表如下:i+)/打印优先关系表ccrr10i;ccrr2i0 else if(crrij=1)= else if(crrij=2) else if(crrij=3)

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

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