




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验三:正规文法到正规式的转换一:要求输入任意的正规文法,输出相应的正规式二:实验目的熟练掌握正规文法到正规式的转换规则理解正规文法和正规式的等价性三:实验原理1.一个正规语言可以由正规文法定义,也可以由正规式定义,对任意一个正规文法,存在一个定义同一个语言的正规式,反之,对每个正规式,存在生成同一个语言的正规文法2正规文法与正规式的转换规则:1.A-〉xB,B->y则:A=xy2.A-〉xA,A->y则:A-〉x*y3.A-〉x,A-〉y则:A=x|y四:数据结构与算法structChomsky{stringleft;stringright;};voidapart(Chomsky*p,inti)//分开产生式左右部voidVNVT(Chomsky*p)//求VN和VTintzero(Chomsky*p)//0型文法intone(Chomsky*p)//1型文法inttwo(Chomsky*p)//2型文法intthree(Chomsky*p)//3型文法voidchange(Chomsky*p)//正规文法到正规式的转换函数五:出错分析1:#include<iostream>忽视了c++语言中的头文件应当去掉.h,须再另加上usingnamespacestd;2:规则分解不对,导致结果出错。3:太多循环嵌套容易造成程序出错,养成把括号提前打好的习惯。六:实验结果与分析不是正规文法的不能转换:是正规文法的才可以转换:七:源代码#include<iostream>#include<string>usingnamespacestd;#definemax50intNONE=1;stringstrings,noend,end;//非终结符与终结符存储intn;//产生式总数structChomsky{stringleft;stringright;};voidapart(Chomsky*p,inti)//分开产生式左右部{intj;for(j=0;j<strings.length();j++)if(strings[j]=='-'){p[i].left=strings.substr(0,j);p[i].right=strings.substr(j+1,strings.length()-j);}}voidVNVT(Chomsky*p)//求VN和VT{inti,j;for(i=0;i<n;i++){for(j=0;j<(int)p[i].left.length();j++){if((p[i].left[j]>='A'&&p[i].left[j]<='Z'))//非终结符判断{if(noend.find(p[i].left[j])>100)noend+=p[i].left[j];}else{if(end.find(p[i].left[j])>100)end+=p[i].left[j];}}for(j=0;j<(int)p[i].right.length();j++){if(!(p[i].right[j]>='A'&&p[i].right[j]<='Z'))//终结符判断{if(end.find(p[i].right[j])>100)end+=p[i].right[j];}else{if(noend.find(p[i].right[j])>100)noend+=p[i].right[j];}}}}intzero(Chomsky*p)//0型文法{intflag(0),count(0);inti,j;for(i=0;i<n;i++){for(j=0;j<(int)p[i].left.length();j++){if(p[i].left[j]>='A'&&p[i].left[j]<='Z')//有否非终结符flag++;}if(flag>0){flag=0;count++;}elsebreak;//左部没有非终结符,结束}if(count==n)return1;//属于0型文法else{cout<<endl<<"所输产生式不属于任何文法。"<<endl;NONE=0;return0;}}intone(Chomsky*p)//1型文法{intflag(0);inti;if(zero(p)){for(i=0;i<n;i++){if(p[i].right.length()<p[i].left.length())//右部长度是否小于左部{flag++;break;}}}elseflag--;if(flag>0){cout<<endl<<"此文法属于0型文法,即短语文法。"<<endl;return0;//不属于1型文法}elseif(flag==0)return1;//属于1型文法elsereturn0;}inttwo(Chomsky*p)//2型文法{intflag(0);inti;if(one(p)){for(i=0;i<n;i++)if((p[i].left.length()!=1)||!(p[i].left[0]>='A'&&p[i].left[0]<='Z'))//左部不属于一个字符或不属于非终结符{flag++;break;}}elseflag--;if(flag>0){cout<<endl<<"此文法属于1型文法,即上下文有关文法。"<<endl;return0;//不属于2型文法}elseif(flag==0){return1;//属于2型文法}elsereturn0;}intthree(Chomsky*p)//3型文法{intflag=0;inti;if(two(p)){for(i=0;i<n;i++)if(!(p[i].right.length()==1||p[i].right.length()==2)||(p[i].right[0]>='A'&&p[i].right[0]<='Z'))//右部字符个数不是1或2,或首字符是非终结符{flag++;break;}elseif((p[i].right.length()==2)&&!(p[i].right[1]>='A'&&p[i].right[1]<='Z'))//第二个字符不是非终结符{flag++;break;}}elseflag--;if(flag>0){cout<<"此文法属于2型文法,即上下文无关文法。"<<endl;i=n;return0;}elseif(flag==0){cout<<"此文法属于3型文法,即正规文法。"<<endl;return1;}elsereturn0;}voidchange(Chomsky*p)//正规文法到正规式的转换函数{inti,j,m,flag;//合并产生式for(i=0;i<n;i++)for(j=i+1;j<n;j++){if((p[i].left==p[j].left)&&(p[i].right[1]==p[j].right[1])){if(p[i].right[1]==p[j].right[1]&&p[i].left[0]==p[j].right[1])//合并形如A->aA,A->bA的产生式为A->aA|bA的形式{p[i].right=p[i].right+"|"+p[j].right;p[j].left="";p[j].right="";}elseif(p[i].right[1]==p[j].right[1]&&p[i].left[0]!=p[j].right[1])//合并形如S->aA,S->bA的产生式为S->aA|bA的形式{p[i].right=p[i].right+"|"+p[j].right;p[j].left="";p[j].right="";}}if(p[i].right.length()==1&&p[j].right.length()==1&&p[i].left==p[j].left)//合并形如S->a,S->b,S->c的产生式为S->a|b|c的形式{p[i].right=p[i].right+"|"+p[j].right;p[j].left="";p[j].right="";}}for(i=0;i<n;i++)//提取形如S->aA|bA的公因式为S->(a|b)A的形式{flag=p[i].right.length();if(p[i].right.length()>2&&'A'<=p[i].right[1]&&p[i].right[1]<='Z'&&p[i].right[2]=='|'){for(j=1;j<flag-1;j=j+3){p[i].right[j]='';}if(j==flag-1)p[i].right="("+p[i].right.substr(0,p[i].right.length()-1)+")"+p[i].right.substr(p[i].right.length()-1);}}for(i=0;i<n;i++){if(p[i].left[0]==p[i].right[p[i].right.length()-1]&&p[i].right.length()>1){for(j=0;j<n;j++)if(p[i].left==p[j].left&&j!=i){for(m=0;m<p[j].right.length();m++)if('A'<=p[j].right[m]&&p[j].right[m]<='Z')break;if(m==p[j].right.length()){p[i].right=p[i].right.substr(0,p[i].right.length()-1)+"*"+"("+p[j].right+")";p[j].right="";p[j].left="";}}}}flag=n;while(flag>=0)//当所有产生式的右部均为终结符构成时停止转换for(i=0,flag=flag-1;i<n;i++)for(j=0;j<p[i].right.length();j++)if('A'<=p[i].right[j]&&p[i].right[j]<='Z'){for(m=0;m<n;m++){if(p[m].left[0]==p[i].right[j]&&m!=i){p[i].right=p[i].right.substr(0,j)+p[m].right+p[i].right.substr(j+1);p[m].left="";p[m].right="";break;}}}//再次合并左部相等的产生式for(i=0;i<n;i++)for(j=0;j<n;j++){if(p[i].left[0]==p[j].left[0]&&i!=j){if(p[j].right.length()>1){p[i].right=p[i].right+"|"+"("+p[j].right+")";p[j].left="";p[j].right="";}else{p[i].right=p[i].right+"|"+p[j].right;p[j].left="";p[j].right="";}}}}voidmain(){inti,j;cout<<"....................编译原理实验三:正规文法到正规式的转换...................."<<endl;cout<<"请输入正规文法(三型文法)的产生式总数及各产生式:"<<endl<<"其中左右部之间用'-'表示,空用'#'表示"<<endl;cin>>n;Chomsky*p=newChomsky[max];for(i=0;i<n;i++){cin>>strings;ap
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业物流管理与服务创新计划实施方案
- 历史学科课外拓展计划
- 企业内部员工培训计划执行合同
- 人美版小学美术课堂创新计划
- 生果销售合同
- 小学美育教育学生作品展览计划
- 企业卫生责任制实施计划
- 环境保护项目变更管理计划
- 人教版数学教学交流与分享计划
- 化工企业危险废物管理计划
- 地下管道漏水抢修施工方案范本
- 中国儿童戏剧发展史
- WMO三年级初级测评专项训练
- 酸洗作业指导书详解
- 《加压甲醇制低碳烯烃催化剂反应性能试验方法》
- 《大学英语四级强化教程(含微课)》 第三章 阅读理解
- 免疫应答 免疫应答(免疫学检验课件)
- 高标准基本农田建设资金使用管理办法
- 招聘专员岗位月度KPI绩效考核表
- 静电的防止与利用-说课课件
- GB/T 10781.1-2006浓香型白酒
评论
0/150
提交评论