Chomsky文法类型判断试验报告.doc

上传人:jian****018 文档编号:8068909 上传时间:2020-03-27 格式:DOC 页数:9 大小:98.50KB
返回 下载 相关 举报
Chomsky文法类型判断试验报告.doc_第1页
第1页 / 共9页
Chomsky文法类型判断试验报告.doc_第2页
第2页 / 共9页
Chomsky文法类型判断试验报告.doc_第3页
第3页 / 共9页
点击查看更多>>
资源描述
编译原理实验报告实验名称 Chomsky 文法类型判断 实验时间 院系 班级 学号 姓名 1.试验目的输入:一组任意的规则。 输出:相应的Chomsky 文法的类型。2.实验原理10型文法(短语文法)如果对于某文法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型文法的规则左部的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,显示了上下文无关的特点。2型文法所确定的语言为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。按照定义,对于正则文法应用规则时,单个非终结符号只能被替换为单个终结符号,或被替换为单个非终结符号加上单个终结符号,或者被替换为单个终结符号加上单个非终结符号。3型文法所确定的语言为3型语言L3,3型语言可由确定的有限状态自动机来识别。在常见的程序设计语言中,多数与词法有关的文法属于3型文法。可以看出,上述4类文法,从0型到3型,产生式限制越来越强,其后一类都是前一类的子集,而描述语言的功能越来越弱,四类文法及其表示的语言之间的关系可表示为:0型1型2型3型;即L0 L1 L2 L33.实验内容程序清单如下:#include#includeusing namespace std;typedef struct CSS /定义一个产生式结构体 string left; /定义产生式的左部 string right; /定义产生式的右部CSS;bool PSG (CSS *p,int n) /判断0型文法int i,j;for(i=0;in;i+) /循环n次,即遍历所有产生式 for(j=0;j=A&pi.leftj=Z) /判断字符是否是非终结符 break; if(j=pi.left.length() cout该文法不是0型文法endl; return 0;break; if(i=n)return 1;/如果每个产生时都能找到非终结符bool CSG (CSS *p,int n) /判断1型文法int i;if(PSG (p,n) /先判断是否是0型文法 for(i=0;ipi.right.length()&pi.right.length()!=NULL) /判断产生式左部长度是否大于右部 break; if(i=n)return 1; else cout该文法是0型文法endl; return 0; else return 0; bool CFG (CSS *p,int n) /判断2型文法int i;if(CSG (p,n) /同上,先判断低级文法是否成立 for(i=0;i=A&pi.left0=Z) /判断产生式左部长度是否为一,左部第一个是否是非终结符 break; if(i=n)return 1; else cout该文法是1型文法endl; return 0; else return 0;void RG (CSS *p,int n) /判断3型文法int i;if(CFG (p,n) /同上,先判断是否是2型文法 for(i=0;i=3)|(pi.right0=A&pi.right0=Z) /判断产生式右部字符个数是否在12之间,判断右部第一个字符是否是非终结符 break; if(i=n) for(i=0;i=A&pi.right1=Z)break; if(i=n) cout该文法属于3型文法endl; else cout该文法属于2型文法endl; else cout该文法属于2型文法endl;else cout结束endl; void main( )int i,j,n;string input;coutn;CSS *p=new CSSn; / 初始化产生式数组for(i=0;iinput; /输入 for(j=0;jaSBES-aBEEB-BEaB-abbB-bb运行结果:2型文法:9S-aABA-bBS-bBB-bBS-aB-bA-aAB-aA-aS运行结果:3型文法:9S-aAA-bBS-bBB-bBS-aB-bA-aAB-aA-aS运行结果:
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!