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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理实验文法的判断.docx

1、编译原理实验文法的判断文法类型的判断和推导序列的生成 一、实验名称 文法类型的判断和推导序列的生成二、实验目的 输入:一组任意的文法规则和任意符号串。 输出:相应的Chomsky文法类型和推导。三、实验原理 1、文法G定义为四元组(Vn,Vt,P,S) 其中Vn为非终结符(或语法实体,或变量)集:Vt为终结符集;P为规则(-)的集合,(VnVt)*且至少包含一个非终结符,(VnVt)*;Vn,Vt和P是非空有穷集。S称作识别符或开始符,它是一个非终结符,至少要在一条规则中作为左部出现。 2、文法类型的判断 a.设G=(Vn,Vt,P,S)为一文法,若P中的每一个产生式-均满足|=|,仅仅S-除

2、外,则文法G是1型或上下文有关的。 b.设G=(Vn,Vt,P,S),若P中的每一个产生式-满足: 是一个非终结符,(VnVt)*,则此文法称为2型的或上下文无关的。 c. 设G=(Vn,Vt,P,S),若P中的每一个产生式的形式都是A-B或A-,其中A和B都是终结符,Vt*,则G是3型文法或正规文法。四、实验思路 本实验采取C+来完成,用大写字母A到Z表示非终结符,小写字符a到z表示终结符。实验流程图 1、接受产生式 首先建立一个结构体siyuanzu,其成员有非终结符集合数组Vn,终结符集合数组Vt以及产生式集合数组rule,通过函数input来接受从键盘输入的产生式,并且存储于strin

3、g类字符串数组rule中。函数input实现接受产生式功能的思路为:先确定要输入的产生式数目n,用for循环实现产生式的存储。 2、文法类型的判断 函数Grammer实现判断文法类型的功能并且输出文法的类型。其实现功能的思路为: a.对rule数组中每一个产生式进行判断,以“-”中的“-”作为判断条件,将产生式分为左部和右部分别计算左部和右部的长度。若youb小于左部则不是1型文法。输出0型文法;若右部大于或等于左部,则继续判断。 b.判断文法是否为2型文法,经过a步骤的执行,若文法为1型文法,只需在此基础上判断文法的左部是否只有一个非终结符。通过判断条件zuo=1&A=a.ruleizuo-

4、1&a.ruleizuo-1=a)&(a.ruleinum+1=A)&(a.ruleinum+2=a)&(a.ruleinum+1=A)&(a.ruleinum+1=a)&(a.ruleinum+2=a)&(a.ruleinum+1=z)判断是否满足B或形式。若所有产生式同时满足判断条件一或者同时满足判断条件二,则为3型文法进行输出。否则为2型文法进行输出。 3、将文法以四元组形式输出 函数output实现输出文法四元组形式的功能。具体思路为: a.将存放产生式的string类数组rule一分为二,用x数组存放rule中所有的大写字母即非终结符,用y数组存放rule中所有的小写字母即终结符。

5、b.用双重for循环给x和y数组中重复的字符标记,重复的字符全部赋值为“!”c.将x数组中非“!”元素赋值给非终结符集Vn,将y数组中非“!”元素赋值给终结符集Vt。 d.按照格式分别输出非终结符集Vn,终结符集Vt,产生式P以及开始符S。五、实验小结 我运用C+解决了此次实验的文法类型判断的问题,在实际解决问题的过程中,主要遇到了以下几个问题: 1、文法类型的判断条件 编译原理书本上给出了几类文法类型的定义,但是在实际的解决问题过程中,需要将书本上给的判断条件转换为C+语言中的判断条件,这需要对文法类型的定义有很好的理解。我通过判断产生式右部是否大于等于左部确定1型文法,在此基础上判断产生式

6、左部是否为一个非终结符确定2型文法,最后在2型文法的基础上判断产生式是否全部满足B或形式或者是B或形式确定3型文法。最终解决了文法类型判断条件的问题。 2、产生式的存储问题 实验要求最少输入五条产生式,我最初是选择用C语言解决存储问题,但是发现C语言中对于字符串的处理不够灵活,于是选择了C+来解决。C+中可以用string类型来定义字符串数组,并且可以通过length函数求每个字符串的长度,这样给每条产生式的判断都带来了极大的便捷。 3、文法以四元组形式输出问题实验需要输出文法的四元组,即需要输出非终结符集Vn,终结符集Vt,产生式P以及开始符S,由于我将产生式存储在string类数组rule

7、中,因此,需要将rule中的元素分为两类,大写字母为非终结符,小写字母为终结符。但是分好类的数组存在元素重复的问题,我通过一个双重for循环给重复元素标记为“!”,再将非“!”元素赋值给字符数组Vn和Vt,解决了元素重复问题。最后需要安排一下输出的格式即解决了这个问题。通过本次实验,我深入的了解了文法类型的判断,对于文法类型的判断也更加的熟练。同时,对于文法的四元组的定义更加的熟悉,并且对于运用C+解决编译原理的问题有了一定的基础。六、附件 1、源代码#include#includeusing namespace std;struct siyuanzu char Vn50; char Vt50

8、; string rule20;int input(siyuanzu *a) int n,i; coutn; cout请输入产生式:n; for(i=0;i(*a).rulei; return n;void output(siyuanzu a,int n) int i,j,length,k1=0,k2=0,m1=0,m2=0; char x50,y50; for(i=0;in;i+) length=a.rulei.length(); for(j=0;j) if(a.ruleij=A&a.ruleij=Z) xk1=a.ruleij; k1+; else yk2=a.ruleij; k2+; f

9、or(i=0;ik1-1;i+) for(j=i+1;jk1;j+) if(xi=xj) xj=!; for(i=0;ik1;i+) if(xi!=!) a.Vnm1=xi; m1+; for(i=0;ik2-1;i+) for(j=i+1;jk2;j+) if(yi=yj) yj=!; for(i=0;ik2;i+) if(yi!=!) a.Vtm2=yi; m2+; cout四元组G=(Vn,Vt,P,S)endl; cout其中非终结符Vn=; for(i=0;im1-1;i+) couta.Vni,; couta.Vnm1-1; cout; coutendl; cout终结符Vt=;

10、for(i=0;im2-1;i+) couta.Vti,; couta.Vtm2-1; cout; coutendl; coutP由下列产生式组成:endl; for(i=0;in;i+) couta.ruleiendl; cout开始符为:Sendl;void Grammer(siyuanzu a,int n) int i,j,length,num,zuo,you; char c; for(i=0;in;i+) num=0; length=a.rulei.length(); for(j=0;j=zuo) continue; else break; if(i=n) for(i=0;in;i+)

11、 num=0; length=a.rulei.length(); for(j=0;jlength;j+) c=a.ruleij; num+; if(c=-) break; zuo=num-1; if(zuo=1&A=a.ruleizuo-1&a.ruleizuo-1=Z) continue; else break; if(i=n) for(i=0;in;i+) num=0; length=a.rulei.length(); for(j=0;j=a)&(a.ruleinum+1=A)&(a.ruleinum+2=a)&(a.ruleinum+1=z) continue; else break;

12、if(i=n) cout文法类型:3型文法endl; else for(i=0;in;i+) num=0; length=a.rulei.length(); for(j=0;j=A)&(a.ruleinum+1=a)&(a.ruleinum+2=a)&(a.ruleinum+1=z) continue; else break; if(i=n) cout文法类型:3型文法endl; else cout文法类型:2型文法endl; else cout文法类型:1型文法endl; else cout文法类型:0型文法endl;int main() int n,r; siyuanzu a; while

13、(1) cout-文法类型判断(E21414020 陈国柱)-endl; cout 1.输入产生式endl; cout 2.输出文法类型及四元组endl; cout 3.结束endl; cout输入功能号:r; if(r3|r1) do cout输入有误,重新输入r; while(r=1); switch(r) case 1:n=input(&a);break; case 2:Grammer(a,n);output(a,n);break; case 3:exit(0);break; default:break; return 0;2、运行结果截图a.实验开始图b.非1型文法c.1型文法d.2型文法e.3型文法f.实验结束图 (注:文档可能无法思考全面,请浏览后下载,供参考。可复制、编制,期待你的好评与关注)

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

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