编译原理方法分类_第1页
编译原理方法分类_第2页
编译原理方法分类_第3页
编译原理方法分类_第4页
编译原理方法分类_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、编号: 实习一二三四五六七八九十总评教师签名成绩实习题目: 文法分类 专业(班): 13级计科六班 学生学号: 2013311500123 学生姓名: 刘 冠 佐 任课教师: 杜卓敏 评语及建议:年 10 月 13 日编号: 实习一二三四五六七八九十总评教师签名成绩武汉大学计算机学院编译原理课程实习报告编 号: 实习题目: 文法分类 专业(班): 2013级计科六班 学生学号: 2013311500123 学生姓名: 刘 冠 佐 任课教师: 杜卓敏 年 10 月 13 日1. 题目:文法分类2. 目的:熟悉和掌握文法的形式定义及各成分的含义,正确识别文法的类型。3. 要求:(1) 主要功能:识

2、别各类chomsky文法(2) 系统输入:任意的文法g的vn,p和s(3) 系统输出: a)文法的形式化表示g=(vn,vt,p,s) b)文法的chomsky类型(0型、1型、2型、3型)(4)为了简单期间,文发符号都采用单字符符号(5)有独到个后选式的产生式允许采用缩写形式(:=1/2/n)作为产生式的输入形式(6)提交算法描述,最好提供某样详细设计表示(如程序框图、伪码等),而不用提交源程序清单4.程序运行实例:输入: 提示输入文法:gn 提示输入vn:n,d 提示依次输入产生式规则:n:=nd/d d:=0/1/2/3/4/5/6/7/8/9输出: 文法gn=(n,d,0,1,2,3,

3、4,5,6,7,8,9,p,n) p: n:=nd/d d:=0/1/2/3/4/5/6/7/8/9 该文法是chomsky2型文法(即上下文无关文法)。1. 问题定义与分析1.1 实习目的 熟悉和掌握文法的形式定义及各成分的含义,正确识别文法的类型。1.2 实习要求 (1) 主要功能:识别各类 chomsky文法 (2) 系统输入:任意的文法 g 的 vn,p和 s (3) 系统输出: a) 文法的形式化表示 g=(vn,vt,p,s) b) 文法的 chomsky类型(0型、1型、2型、3型) (4) 为简单起见,文法符号都采用单字符符号。 (5) 有多个候选式的产生式允许采用缩写形式(:

4、= 1|2|n)作为产生式的输入形式 (6) 要求按照软件工程的原则进行实习设计,提交实习报告,即必要的软件工程文档(可将主要内容压缩成一个文档) ,内容至少包括:问题定义和分析、设计(数据结构、算法、界面等) 、主要测试用例(应如实提供测试结果)等。最好提供某种详细设计表示(如程序框图、伪码等),而不用提交源程序清单。 1.3 要求分析1.3.1 输入部分对于文法g用字符串string s保存;非终结字符集合vn,用数组c保存,string s1=jtextfield2.gettext();/获取vn,char c=s1.tochararray();产生式规则p的用二维数组p保存:char

5、p=new char1020; string s2=jtextarea1.gettext();/获取产生式规则 stringtokenizer tokenizer=new stringtokenizer(s2); int sum=tokenizer.counttokens(); int j; string s4="" for(j=0;j<sum;j+) string s6=tokenizer.nexttoken(); s4=s4+s6+'n' pj=s6.tochararray();/将产生式转换为数组保存 1.3.2 输出部分非终结字符用一个数组n保

6、存输出: string s1=jtextfield2.gettext();/获取vn char c=s1.tochararray(); while(i<c.length)if(ci!=',')nm=ci;m+;i+;终结字符用一个数组t保存: for(j=0;j<pi.length;j+) if(pij!=':'&&pij!='='&&pij!='|'&&is(n, pij)=0&&is(t, pij)=0) tm=pij; m+; 对于文法g的输出还是用

7、string s,在获取的文法名的基础上加上文法内容,文法内容为后面加上: string s=jtextfield1.gettext();/s用于输出文法s=s+"=("+s1+"," string s3="" i=0; while(i<m) if(i+1<m) s3=s3+ti+','/将终结字符串中的字符加上,输出 else s3=s3 +ti;/终结字符串的最后一个字符不用加, i+; s=s+s3+",p,"+c0+')' jtextfield3.settext(

8、s);产生式规则的输出用string s4表示: string s4=""for(j=0;j<sum;j+) string s6=tokenizer.nexttoken(); s4=s4+s6+'n' jtextarea2.settext(s4);对于判定结果的输出,用string s5表示: string s5=""/根据算法结果决定输入的文法为哪种类型,则对应给s5赋不同字符串case 1:if(flag=1) s5=s5+"该文法是chomsky0 型文法(即短语结构文法)!"else s5=s5+&quo

9、t;该文法是chomsky1 型文法(即上下文有关文法)!"dase 2: if(flag=1) s5=s5+"该文法是chomsky2 型文法(即上下文无关文法)!"else s5=s5+"该文法是chomsky3 型文法(即正规文法)!"1.3.3 判定过程 具体的判定算法由各种方法的特点所决定: 首先,因为于2型方法与3型文法的产生式的左部都是单个非终结符,所以若待判定方法的左部是单个非终结符,则可确定其为2型或3型方法,此时已将4种方法分为两组,即0型与1型一组、2型与3型一组; 其次,对于2型与3型文法,因为3型文法是对2型文法的进一

10、步限制。即2型文法产生式右部是由终结符和非终结符组成的符号串,有以下形式的产生式: a:=ð ,其中a属于vn,ð属于终结符和非终结符组成的符号串。 而3型文法限制产生式右部是单一终结符或单一终结符跟着单一非终结符,即: a:=a 或a:=ab所以,可通过对产生式的右部判断来区分2型与3型文法。 最后,对于0型与1型文法,因为0型文法产生式的左部与右部都是符号串,没任何限制,所以可以通过1型文法的限制来区分;1型文法的限制如下所示: := ,其中1| 且1型文法的左部必须有非终结字符。2. 设计2.1 数据结构 定义了以下字符串类型数据:string s :用于接受用户输入

11、的文法名与输出最终的完整文法,如:接受输入s="gn",输出s="gn(n,d, 0,1,2,3,4,5,6,7,8,9, p, n)" string s1:用于获取vnchar c=s1.tochararray() :用于将s1字符串转换为数组char n=new char10 :用于保存去除,的纯非终结字符如:输入 s,a,b,c 则 s1=s,a,b,c; c=s,a,b,c; n=s a b cchar t=new char20 :用于保存纯终结字符如: 其中一个产生式规则p为n:=1|2|3|4 , 则t=1 2 3 4string s2: 用

12、于获取产生式规则stringtokenizer tokenizer :用于按回车符区分不同产生式,以便按序分别获取产生式char p=new char1020 :用于将产生式规则用二维数组保存string s4 :用于输出产生式规则的字符串 string s5 :用于输出判定结果,即输出为哪一类文法若为2型文法,则s5=“该文法是chomsky2 型文法(即上下文无关文法)!”以下是各个控件的定义: private javax.swing.jbutton jbutton1; 确定按钮 private javax.swing.jbutton jbutton2; 清空按钮private javax

13、.swing.jbutton jbutton3; 退出按钮静态文本的输出,即在界面上显示输入、输出、方法等提示文字: private javax.swing.jlabel jlabel1; private javax.swing.jlabel jlabel2; private javax.swing.jlabel jlabel3; private javax.swing.jlabel jlabel4; private javax.swing.jlabel jlabel5; private javax.swing.jlabel jlabel6;private javax.swing.jlabel

14、 jlabel7; private javax.swing.jlabel jlabel8; private javax.swing.jtextarea jtextarea1; 输入产生式规则框 private javax.swing.jtextarea jtextarea2; 输出产生式规则框 private javax.swing.jtextfield jtextfield1; 输入文法名框 private javax.swing.jtextfield jtextfield2; 输入文法的vn的框 private javax.swing.jtextfield jtextfield3; 输出完

15、整文法定义的框private javax.swing.jtextfield jtextfield4; 输出是哪类文法的框如下图所示:2.2. 算法及程序流程图2.2.1算法描述如下: 对于输入的产生式规则:1. 判断是否为合法的文法:是转4,否继续;2. 提示有误,是否重新输入:是转1,否继续;3. 退出系统。4. 通过产生式规则的左部,确定文法类型是2、3型还是0、1型,定义变量fi作为区分此两大类方法:fi=1(表示为0、1型),继续;fi=2(表示为2、3型),转9(fi用于控制switch语句执行);5. 判断每个产生式左部是否都含有非终结字符:否,转8;是,继续;6. 判断文法每个产

16、生式规则左部的字符串的数量是否小于等于右部的字符串的数量:是,继续;否,转8;7. 此文法为1型文法;8. 此文法为0型文法;9. 判断每个产生式规则右部字符数是否小于等于2:是,继续;否,转13;10. 判断每个产生式规则右部字符数为1的字符是否为终结字符:是,继续;否,转13;11. 判断每个产生式规则右部字符数为2的字符串是否为一个终结符后面跟着一个非终结符:是,继续;否,转13;12. 此文法为3型文法;13. 此文法为2型文法;nnnnnyyyy此文法为1型文法每个产生式左部皆含vn?每个产生式左部字符数目小于等于右部字符的数目?sum0=2时,为一终结符跟着一非终结字符?此文法为3

17、型文法n开始输入文法、vn、p文法合法?重新输入?y结束n产生式左部皆为一个非终结字符?yfi=1fi=2ny每个产生式右部字符数sum0皆小于等于2?sum0=1时,此字符为终结字符?此文法为2型文法此文法为0型文法y2.2.1程序流程图如下: 2.3. 界面3. 程序运行实例 3.1 3 型文法 3.2 2 型文法 3.3 1 型文法 3.4 0 型文法 3.5 非合法文法输入选是,继续输入:选否,退出程序。对于清空按钮,点击则清空所有文本框;对于退出按钮,点击则退出程序。4. 程序核心源代码 public int is(char a,char c) /判断字符c是否在数组a中int s=

18、0,f=0;while(s<a.length)if(as=c)f=1;s+;return f;public int sum(char a) /计算数组a中字符|的数目int s=0,i=0;for(i=0;i<a.length;i+) if(ai='|') s+;return s;/ 以下代码为判定输入的文法为哪类文法,参数r是存在二维数组中的产生式规则,参/ 数j是通过之前的代码已确定该文法为0、1型(j=1)还是2、3型(j=2),参数sum / 是产生式规则的数量,参数t是终结字符的数组,参数n是非终结字符的数组。public void classify(ch

19、ar r,int j,int sum,char t,char n)int flag=0; string s5=""switch(j)case 1: /通过传递的参数知,为0、1型,case 1中为判断具体是0型还是1型文法for(int i=0;i<sum;i+) int flag0=0; int i2=0,j2,k=0,k2; int sum1=sum(ri);while(rii2!=':') if(is(n, rii2)=1) flag0=1; i2+; if(flag0=0) flag=1; break; j2=i2+3;k2=j2;for (k=0;k<sum1+1;k+)while(k2<ri.length&&rik2!='|')k2+;if(i2>k2-j2)flag=1;br

温馨提示

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

评论

0/150

提交评论