chomsky文法类型的判断Word版_第1页
chomsky文法类型的判断Word版_第2页
chomsky文法类型的判断Word版_第3页
chomsky文法类型的判断Word版_第4页
chomsky文法类型的判断Word版_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、传播优秀word版文档 ,希望对您有帮助,可双击去除!编译原理实验报告实验名称 chomsky文法类型判断 实验时间 2014-4-2 院系 计算机科学与技术学院 班级 2011级科技(3)班 学号 e01114375 姓名 张练钢 传播优秀word版文档 ,希望对您有帮助,可双击去除!1. 实验目的(1)通过实验进一步理解chomsky文法类型判断的的依据,理解每个类型文法的特点。(2)进一步理解4种文法类型之间的包含关系。(3)体会这种理论对于计算机科学发展的深刻影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面的重大作用。通过上机实现文法类型的自动判别。2.实验原理10型文法(

2、短语文法)如果对于某文法g,p中的每个规则具有下列形式:u: = v其中uv,vv*,则称该文法g为0型文法或短语文法,简写为psg。0型文法或短语结构文法的相应语言称为0型语言或短语结构语言l0。这种文法由于没有其他任何限制,因此0型文法也称为无限制文法,其相应的语言称为无限制性语言。任何0型语言都是递归可枚举的,故0型语言又称递归可枚举集。这种语言可由图灵机(turning)来识别。21型文法(上下文有关文法)如果对于某文法g,p中的每个规则具有下列形式:xuy: = xuy其中uvn;uv;x,yv*,则称该文法g为1型文法或上下文有关文法,也称上下文敏感文法,简写为csg。1型文法的规

3、则左部的u和右部的u具有相同的上文x和下文y,利用该规则进行推导时,要用u替换u,必须在前面有x和后面有y的情况下才能进行,显示了上下文有关的特性。1型文法所确定的语言为1型语言l1,1型语言可由线性有界自动机来识别。32型文法(上下文无关文法)如果对于某文法g,p中的每个规则具有下列形式:u : = u其中uvn;uv,则称该文法g为2型文法或上下文无关文法,简写为cfg。按照这条规则,对于上下文无关文法,利用该规则进行推导时,无需考虑非终结符u所在的上下文,总能用u替换u,或者将u归约为u,显示了上下文无关的特点。传播优秀word版文档 ,希望对您有帮助,可双击去除!2型文法所确定的语言为

4、2型语言l2,2型语言可由非确定的下推自动机来识别。一般定义程序设计语言的文法是上下文无关的。如c语言便是如此。因此,上下文无关文法及相应语言引起了人们较大的兴趣与重视。43型文法(正则文法,线性文法)如果对于某文法g,p中的每个规则具有下列形式:u : = t 或 u : = wt其中tvt;u,wvn,则称该文法g为左线性文法。如果对于某文法g,p中的每个规则具有下列形式:u : = t 或 u : = tw其中tvt;u, wvn,则称该文法g为右线性文法。左线性文法和右线性文法通称为3型文法或正则文法,有时又称为有穷状态文法,简写为rg。按照定义,对于正则文法应用规则时,单个非终结符号

5、只能被替换为单个终结符号,或被替换为单个非终结符号加上单个终结符号,或者被替换为单个终结符号加上单个非终结符号。3型文法所确定的语言为3型语言l3,3型语言可由确定的有限状态自动机来识别。在常见的程序设计语言中,多数与词法有关的文法属于3型文法。可以看出,上述4类文法,从0型到3型,产生式限制越来越强,其后一类都是前一类的子集,而描述语言的功能越来越弱,四类文法及其表示的语言之间的关系可表示为:0型1型2型3型;即l0 l1 l2 l3.实验内容(1)理解四种文法类型的特点,并利用他们之间包含关系0型1型2型3型;即l0 l1 l2 l对所属类型作出判断。(2)通过编程自动实现将输入的文法判断

6、出其所属类型。4.实验心得本实验的上机实现需注意一下几点:(1)数据的表示,利用struct constring front;string end;/定义每个产生式的结构如a:=a 则front=a,end=a;因为每个文法都有多个产生式,我们将这多个文法依次存入一个string类型的test数组中,然后再将每个产生式分解成前端和后端的格式以便于分析每个产生式所属的类型。传播优秀word版文档 ,希望对您有帮助,可双击去除!(2)在对文法进行判断前先对每个产生式作出判断,那么所有产生式中文法类型最低的那个产生式所属的类型即为该文法所属的类型。(3)在对每个每个产生的类型做出判断时要充分利用四种

7、文法类型之间的包含关系以简化程序。如3型文法和2型文法的产生前端都为一个非终端符我们可以先利用这个特点先判断一个产生式是否属于3型文法或2型文法,如果不符合以上条件然后在判断其是否属于1型或0型文法。(4)在代码的编写过程中注意代码的结构以方便阅读。5.实验代码与结果/* 作者: 张练钢(e01114375) 完成时间:2014-4-5 程序任务:chomsky文法类型的判断 运行环境:vc+ 6.0 */#include<iostream>#include<string>#include<vector>using namespace std;struct

8、constring front;string end;/定义每个产生式的结构如a:=a 则front=a,end=a;string vnt;/非终端符集合string vt;/终端符集合void decompose(string s, con &res)/该函数负责将输入的每个产生式转换成con结构如a:=a 则front=a,end=a;int flag1=0,flag2=0;for(int i=0;i<s.size();i+)if(si=':')flag1=i;else if(si='=')flag2=i;res.front=s.substr(

9、0,flag1-1);res.end=s.substr(flag2+1,s.size()-1);传播优秀word版文档 ,希望对您有帮助,可双击去除!bool isbelongtovnt(char s)/判断一个字符是否属于非终端字符for(int i=0;i<vnt.size();i+)if(vnti=s)return 1;return 0;bool isbelongtovt(char s)/判断一个字符是否属于终端字符for(int i=0;i<vt.size();i+)if(vti=s)return 1;return 0;bool isbelongtov(char s)/判断

10、一个字符是否属于vnt u ntstring tem=vnt+vt;/因为终端符和非终端符没有交集所以两个字符串直接连接的结果即为vnt u ntfor(int i=0;i<tem.size();i+)if(temi=s)return 1;return 0;int judgetypeofp(con sen)/判断每个产生式的类型int flag=0;for(int i=0;i<sen.front.size();i+)if(isbelongtov(sen.fronti)=0)/如果产生式前端中含有非v中的元素则不属于任何文法类型flag=1;传播优秀word版文档 ,希望对您有帮助,

11、可双击去除!break;if(flag=1)return -1;flag=0;for(i=0;i<sen.end.size();i+)if(isbelongtov(sen.endi)=0 && sen.endi!='e')/如果产生式后端端中含有非v中的元素(空e除外)则不属于任何文法类型flag=1;break;if(flag=1)return -1;if(sen.front.size()=1)/若产生式的前端是一个非终端符则判断其是2型文法还是3型文法char tem=sen.front0;if(isbelongtovnt(tem)/如果front为非

12、终端符则先判断该产生式是不是正规文法或2型文法的结构if(sen.end.size()=1)if(isbelongtovt(sen.end0)/如果是a:=a则属于正规文法return 3;elsereturn 2; /因为该产生式的前端是非终端字符所以满足2型文法的要求已经包含s:=e(e为空)else if(sen.end.size()=2)if(isbelongtovnt(sen.end1)&&isbelongtovt(sen.end0)/如果是a:=ab则属于正规文法return 3;elsereturn 2;/else if(sen.end.size()=2)传播优秀

13、word版文档 ,希望对您有帮助,可双击去除!/if(isbelongtovnt(tem)elsereturn -1; /如果产生的前端没有非终端符则不符合任何类型的文法/if(sen.front.size()=1)else int flag=0;for(int i=0;i<sen.front.size();i+)if(isbelongtovnt(sen.fronti)/先判断其是否含有非终端符,如果没有则不符合任何文法类型flag=1;break;if(flag=0)return -1;elseif(sen.end.size()>=sen.front.size()/如果产生式-&

14、gt;满足|>=|则符合1型文法的要求,否则就是零型文法return 1;elsereturn 0;void judge(int res100,int count)/根据每个产生式的类型判断文法的类型int j,flag=1;switch(res0)case 3:for(j=0;j<count;j+)if(resj<3)传播优秀word版文档 ,希望对您有帮助,可双击去除!flag=0;break;if(flag=1)cout<<"这是 3 型文法 "<<endl;/如果所有的产生式都是3型文法则该文法为3型文法break;case

15、 2:flag=1;for( j=0;j<count;j+)if(resj<2)flag=0;break;if(flag=1)cout<<"这是 2 型文法 "<<endl;/如果所有的产生式都是2型及以上类型文法则该文法为2型文法break;case 1:flag=1;for(j=0;j<count;j+)if(resj<1)flag=0;break;if(flag=1)cout<<"这是 1 型文法 "<<endl;/如果所有的产生式都是1型及以上类型文法则该文法为1型文法bre

16、ak;case 0:flag=1;传播优秀word版文档 ,希望对您有帮助,可双击去除!for(j=0;j<count;j+)if(resj<0)flag=0;break;if(flag=1)cout<<"这是 0 型文法 "<<endl;/如果所有的产生式都是0型及以上类型文法则该文法为0型文法break;default :cout<<"这不是任何类型的文法 "<<endl;int main()int count=0; /记录输入产生式的个数string test100; /存放每个文法的产生

17、式char tem100; /临时输入的字符串int res100; /用于存放每个产生式的判别结果cout<<"请先输入非终端符:"<<endl;cin>>tem;vnt=tem;cout<<"请输入终端符号"<<endl;cin>>tem;vt=tem;cout<<"请输入产生式:最后一条产生式以eof结束"<<endl;while(cin>>tem )testcount+=tem;for(int i=0;i<count;i+)con

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论