编译原理方法分类.docx
《编译原理方法分类.docx》由会员分享,可在线阅读,更多相关《编译原理方法分类.docx(16页珍藏版)》请在冰豆网上搜索。
编译原理方法分类
编号:
实习
一
二
三
四
五
六
七
八
九
十
总评
教师签名
成绩
实习题目:
文法分类
专业(班):
13级计科六班
学生学号:
2013311500123
学生姓名:
刘冠佐
任课教师:
杜 卓 敏
评语及建议:
2015 年10月13日
武汉大学计算机学院
《编译原理》课程
实习报告
2013级计科六班
1.题目:
2.目的:
熟悉和掌握文法的形式定义及各成分的含义,正确识别文法的类型。
3.要求:
(1)主要功能:
识别各类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.程序运行实例:
输入:
提示输入文法:
G[N]
提示输入Vn:
N,D
提示依次输入产生式规则:
N:
:
=ND/D
D:
=0/1/2/3/4/5/6/7/8/9
输出:
文法G[N]=({N,D},{0,1,2,3,4,5,6,7,8,9},P,N)
P:
该文法是Chomsky2型文法(即上下文无关文法)。
1.问题定义与分析
1.1实习目的
1.2实习要求
任意的文法G的VN,P和S
a)文法的形式化表示G=(VN,VT,P,S)
(4)为简单起见,文法符号都采用单字符符号。
(5)有多个候选式的产生式允许采用缩写形式(α:
=β1|β2|…|βn)作为产生式的输入形式
(6)要求按照软件工程的原则进行实习设计,提交实习报告,即必要的软件工程文档(可将主要内容压缩成一个文档),内容至少包括:
问题定义和分析、设计(数据结构、算法、界面等)、主要测试用例(应如实提供测试结果)等。
最好提供某种详细设计表示(如程序框图、伪码等),而不用提交源程序清单。
1.3要求分析
1.3.1输入部分
对于文法G用字符串Strings保存;非终结字符集合VN,用数组c保存,Strings1=jTextField2.getText();//获取VN,charc[]=s1.toCharArray();
产生式规则P的用二维数组P保存:
char[][]P=newchar[10][20];
Strings2=jTextArea1.getText();//获取产生式规则
StringTokenizertokenizer=newStringTokenizer(s2);
intsum=tokenizer.countTokens();
intj;
Strings4="";
for(j=0;j{Strings6=tokenizer.nextToken();s4=s4+s6+'\n';P[j]=s6.toCharArray();//将产生式转换为数组保存}1.3.2输出部分非终结字符用一个数组N保存输出:Strings1=jTextField2.getText();//获取VNcharc[]=s1.toCharArray();while(iif(c[i]!=','){N[m]=c[i];m++;}i++;终结字符用一个数组T保存:for(j=0;jif(P[i][j]!=':'&&P[i][j]!='='&&P[i][j]!='|'&&Is(N,P[i][j])==0&&Is(T,P[i][j])==0)T[m]=P[i][j];m++;对于文法G的输出还是用Strings,在获取的文法名的基础上加上文法内容,文法内容为后面加上:Strings=jTextField1.getText();//s用于输出文法s=s+"=({"+s1+"},{";Strings3="";i=0;while(iif(i+1s3=s3+T[i]+',';//将终结字符串中的字符加上‘,’输出elses3=s3+T[i];//终结字符串的最后一个字符不用加‘,’i++;}s=s+s3+"},P,"+c[0]+')';jTextField3.setText(s);产生式规则的输出用Strings4表示:Strings4="";for(j=0;j{Strings6=tokenizer.nextToken();s4=s4+s6+'\n';}jTextArea2.setText(s4);对于判定结果的输出,用Strings5表示:Strings5="";//根据算法结果决定输入的文法为哪种类型,则对应给s5赋不同字符串case1:if(flag==1)s5=s5+"该文法是Chomsky0型文法(即短语结构文法)!";elses5=s5+"该文法是Chomsky1型文法(即上下文有关文法)!";dase2:if(flag==1)s5=s5+"该文法是Chomsky2型文法(即上下文无关文法)!";elses5=s5+"该文法是Chomsky3型文法(即正规文法)!";1.3.3判定过程具体的判定算法由各种方法的特点所决定:首先,因为于2型方法与3型文法的产生式的左部都是单个非终结符,所以若待判定方法的左部是单个非终结符,则可确定其为2型或3型方法,此时已将4种方法分为两组,即0型与1型一组、2型与3型一组;其次,对于2型与3型文法,因为3型文法是对2型文法的进一步限制。即2型文法产生式右部是由终结符和非终结符组成的符号串,有以下形式的产生式:A::=ð,其中A属于VN,ð属于终结符和非终结符组成的符号串。而3型文法限制产生式右部是单一终结符或单一终结符跟着单一非终结符,即:A::=a或A::=aB所以,可通过对产生式的右部判断来区分2型与3型文法。最后,对于0型与1型文法,因为0型文法产生式的左部与右部都是符号串,没任何限制,所以可以通过1型文法的限制来区分;1型文法的限制如下所示:α::=β,其中1≤|α|≤|β|且1型文法的左部必须有非终结字符。2.设计2.1数据结构定义了以下字符串类型数据:Strings:用于接受用户输入的文法名与输出最终的完整文法,如:接受输入s="G[N]",输出s="G[N]=({N,D},{0,1,2,3,4,5,6,7,8,9},P,N)"Strings1:用于获取VNcharc[]=s1.toCharArray():用于将s1字符串转换为数组char[]N=newchar[10]:用于保存去除‘,’的纯非终结字符如:输入S,A,B,C则s1=S,A,B,C;c[]={S,A,B,C};N[]={SABC}char[]T=newchar[20]:用于保存纯终结字符如:其中一个产生式规则P为N::=1|2|3|4,则T={1234}Strings2:用于获取产生式规则StringTokenizertokenizer:用于按回车符区分不同产生式,以便按序分别获取产生式char[][]P=newchar[10][20]:用于将产生式规则用二维数组保存Strings4:用于输出产生式规则的字符串Strings5:用于输出判定结果,即输出为哪一类文法若为2型文法,则s5=“该文法是Chomsky2型文法(即上下文无关文法)!”以下是各个控件的定义:privatejavax.swing.JButtonjButton1;确定按钮privatejavax.swing.JButtonjButton2;清空按钮privatejavax.swing.JButtonjButton3;退出按钮静态文本的输出,即在界面上显示输入、输出、方法等提示文字:privatejavax.swing.JLabeljLabel1;privatejavax.swing.JLabeljLabel2;privatejavax.swing.JLabeljLabel3;privatejavax.swing.JLabeljLabel4;privatejavax.swing.JLabeljLabel5;privatejavax.swing.JLabeljLabel6;privatejavax.swing.JLabeljLabel7;privatejavax.swing.JLabeljLabel8;privatejavax.swing.JTextAreajTextArea1;输入产生式规则框privatejavax.swing.JTextAreajTextArea2;输出产生式规则框privatejavax.swing.JTextFieldjTextField1;输入文法名框privatejavax.swing.JTextFieldjTextField2;输入文法的VN的框privatejavax.swing.JTextFieldjTextField3;输出完整文法定义的框privatejavax.swing.JTextFieldjTextField4;输出是哪类文法的框如下图所示: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.判断文法每个产
{Strings6=tokenizer.nextToken();
s4=s4+s6+'\n';
P[j]=s6.toCharArray();//将产生式转换为数组保存
}
1.3.2输出部分
非终结字符用一个数组N保存输出:
Strings1=jTextField2.getText();//获取VN
charc[]=s1.toCharArray();
while(iif(c[i]!=','){N[m]=c[i];m++;}i++;终结字符用一个数组T保存:for(j=0;jif(P[i][j]!=':'&&P[i][j]!='='&&P[i][j]!='|'&&Is(N,P[i][j])==0&&Is(T,P[i][j])==0)T[m]=P[i][j];m++;对于文法G的输出还是用Strings,在获取的文法名的基础上加上文法内容,文法内容为后面加上:Strings=jTextField1.getText();//s用于输出文法s=s+"=({"+s1+"},{";Strings3="";i=0;while(iif(i+1s3=s3+T[i]+',';//将终结字符串中的字符加上‘,’输出elses3=s3+T[i];//终结字符串的最后一个字符不用加‘,’i++;}s=s+s3+"},P,"+c[0]+')';jTextField3.setText(s);产生式规则的输出用Strings4表示:Strings4="";for(j=0;j{Strings6=tokenizer.nextToken();s4=s4+s6+'\n';}jTextArea2.setText(s4);对于判定结果的输出,用Strings5表示:Strings5="";//根据算法结果决定输入的文法为哪种类型,则对应给s5赋不同字符串case1:if(flag==1)s5=s5+"该文法是Chomsky0型文法(即短语结构文法)!";elses5=s5+"该文法是Chomsky1型文法(即上下文有关文法)!";dase2:if(flag==1)s5=s5+"该文法是Chomsky2型文法(即上下文无关文法)!";elses5=s5+"该文法是Chomsky3型文法(即正规文法)!";1.3.3判定过程具体的判定算法由各种方法的特点所决定:首先,因为于2型方法与3型文法的产生式的左部都是单个非终结符,所以若待判定方法的左部是单个非终结符,则可确定其为2型或3型方法,此时已将4种方法分为两组,即0型与1型一组、2型与3型一组;其次,对于2型与3型文法,因为3型文法是对2型文法的进一步限制。即2型文法产生式右部是由终结符和非终结符组成的符号串,有以下形式的产生式:A::=ð,其中A属于VN,ð属于终结符和非终结符组成的符号串。而3型文法限制产生式右部是单一终结符或单一终结符跟着单一非终结符,即:A::=a或A::=aB所以,可通过对产生式的右部判断来区分2型与3型文法。最后,对于0型与1型文法,因为0型文法产生式的左部与右部都是符号串,没任何限制,所以可以通过1型文法的限制来区分;1型文法的限制如下所示:α::=β,其中1≤|α|≤|β|且1型文法的左部必须有非终结字符。2.设计2.1数据结构定义了以下字符串类型数据:Strings:用于接受用户输入的文法名与输出最终的完整文法,如:接受输入s="G[N]",输出s="G[N]=({N,D},{0,1,2,3,4,5,6,7,8,9},P,N)"Strings1:用于获取VNcharc[]=s1.toCharArray():用于将s1字符串转换为数组char[]N=newchar[10]:用于保存去除‘,’的纯非终结字符如:输入S,A,B,C则s1=S,A,B,C;c[]={S,A,B,C};N[]={SABC}char[]T=newchar[20]:用于保存纯终结字符如:其中一个产生式规则P为N::=1|2|3|4,则T={1234}Strings2:用于获取产生式规则StringTokenizertokenizer:用于按回车符区分不同产生式,以便按序分别获取产生式char[][]P=newchar[10][20]:用于将产生式规则用二维数组保存Strings4:用于输出产生式规则的字符串Strings5:用于输出判定结果,即输出为哪一类文法若为2型文法,则s5=“该文法是Chomsky2型文法(即上下文无关文法)!”以下是各个控件的定义:privatejavax.swing.JButtonjButton1;确定按钮privatejavax.swing.JButtonjButton2;清空按钮privatejavax.swing.JButtonjButton3;退出按钮静态文本的输出,即在界面上显示输入、输出、方法等提示文字:privatejavax.swing.JLabeljLabel1;privatejavax.swing.JLabeljLabel2;privatejavax.swing.JLabeljLabel3;privatejavax.swing.JLabeljLabel4;privatejavax.swing.JLabeljLabel5;privatejavax.swing.JLabeljLabel6;privatejavax.swing.JLabeljLabel7;privatejavax.swing.JLabeljLabel8;privatejavax.swing.JTextAreajTextArea1;输入产生式规则框privatejavax.swing.JTextAreajTextArea2;输出产生式规则框privatejavax.swing.JTextFieldjTextField1;输入文法名框privatejavax.swing.JTextFieldjTextField2;输入文法的VN的框privatejavax.swing.JTextFieldjTextField3;输出完整文法定义的框privatejavax.swing.JTextFieldjTextField4;输出是哪类文法的框如下图所示: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.判断文法每个产
if(c[i]!
=',')
{N[m]=c[i];m++;}
i++;
终结字符用一个数组T保存:
for(j=0;j
if(P[i][j]!
=':
'&&P[i][j]!
='='&&P[i][j]!
='|'&&Is(N,P[i][j])==0&&Is(T,P[i][j])==0)
T[m]=P[i][j];m++;
对于文法G的输出还是用Strings,在获取的文法名的基础上加上文法内容,文法内容为后面加上:
Strings=jTextField1.getText();//s用于输出文法
s=s+"=({"+s1+"},{";
Strings3="";
i=0;
while(iif(i+1s3=s3+T[i]+',';//将终结字符串中的字符加上‘,’输出elses3=s3+T[i];//终结字符串的最后一个字符不用加‘,’i++;}s=s+s3+"},P,"+c[0]+')';jTextField3.setText(s);产生式规则的输出用Strings4表示:Strings4="";for(j=0;j{Strings6=tokenizer.nextToken();s4=s4+s6+'\n';}jTextArea2.setText(s4);对于判定结果的输出,用Strings5表示:Strings5="";//根据算法结果决定输入的文法为哪种类型,则对应给s5赋不同字符串case1:if(flag==1)s5=s5+"该文法是Chomsky0型文法(即短语结构文法)!";elses5=s5+"该文法是Chomsky1型文法(即上下文有关文法)!";dase2:if(flag==1)s5=s5+"该文法是Chomsky2型文法(即上下文无关文法)!";elses5=s5+"该文法是Chomsky3型文法(即正规文法)!";1.3.3判定过程具体的判定算法由各种方法的特点所决定:首先,因为于2型方法与3型文法的产生式的左部都是单个非终结符,所以若待判定方法的左部是单个非终结符,则可确定其为2型或3型方法,此时已将4种方法分为两组,即0型与1型一组、2型与3型一组;其次,对于2型与3型文法,因为3型文法是对2型文法的进一步限制。即2型文法产生式右部是由终结符和非终结符组成的符号串,有以下形式的产生式:A::=ð,其中A属于VN,ð属于终结符和非终结符组成的符号串。而3型文法限制产生式右部是单一终结符或单一终结符跟着单一非终结符,即:A::=a或A::=aB所以,可通过对产生式的右部判断来区分2型与3型文法。最后,对于0型与1型文法,因为0型文法产生式的左部与右部都是符号串,没任何限制,所以可以通过1型文法的限制来区分;1型文法的限制如下所示:α::=β,其中1≤|α|≤|β|且1型文法的左部必须有非终结字符。2.设计2.1数据结构定义了以下字符串类型数据:Strings:用于接受用户输入的文法名与输出最终的完整文法,如:接受输入s="G[N]",输出s="G[N]=({N,D},{0,1,2,3,4,5,6,7,8,9},P,N)"Strings1:用于获取VNcharc[]=s1.toCharArray():用于将s1字符串转换为数组char[]N=newchar[10]:用于保存去除‘,’的纯非终结字符如:输入S,A,B,C则s1=S,A,B,C;c[]={S,A,B,C};N[]={SABC}char[]T=newchar[20]:用于保存纯终结字符如:其中一个产生式规则P为N::=1|2|3|4,则T={1234}Strings2:用于获取产生式规则StringTokenizertokenizer:用于按回车符区分不同产生式,以便按序分别获取产生式char[][]P=newchar[10][20]:用于将产生式规则用二维数组保存Strings4:用于输出产生式规则的字符串Strings5:用于输出判定结果,即输出为哪一类文法若为2型文法,则s5=“该文法是Chomsky2型文法(即上下文无关文法)!”以下是各个控件的定义:privatejavax.swing.JButtonjButton1;确定按钮privatejavax.swing.JButtonjButton2;清空按钮privatejavax.swing.JButtonjButton3;退出按钮静态文本的输出,即在界面上显示输入、输出、方法等提示文字:privatejavax.swing.JLabeljLabel1;privatejavax.swing.JLabeljLabel2;privatejavax.swing.JLabeljLabel3;privatejavax.swing.JLabeljLabel4;privatejavax.swing.JLabeljLabel5;privatejavax.swing.JLabeljLabel6;privatejavax.swing.JLabeljLabel7;privatejavax.swing.JLabeljLabel8;privatejavax.swing.JTextAreajTextArea1;输入产生式规则框privatejavax.swing.JTextAreajTextArea2;输出产生式规则框privatejavax.swing.JTextFieldjTextField1;输入文法名框privatejavax.swing.JTextFieldjTextField2;输入文法的VN的框privatejavax.swing.JTextFieldjTextField3;输出完整文法定义的框privatejavax.swing.JTextFieldjTextField4;输出是哪类文法的框如下图所示: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.判断文法每个产
if(i+1s3=s3+T[i]+',';//将终结字符串中的字符加上‘,’输出elses3=s3+T[i];//终结字符串的最后一个字符不用加‘,’i++;}s=s+s3+"},P,"+c[0]+')';jTextField3.setText(s);产生式规则的输出用Strings4表示:Strings4="";for(j=0;j{Strings6=tokenizer.nextToken();s4=s4+s6+'\n';}jTextArea2.setText(s4);对于判定结果的输出,用Strings5表示:Strings5="";//根据算法结果决定输入的文法为哪种类型,则对应给s5赋不同字符串case1:if(flag==1)s5=s5+"该文法是Chomsky0型文法(即短语结构文法)!";elses5=s5+"该文法是Chomsky1型文法(即上下文有关文法)!";dase2:if(flag==1)s5=s5+"该文法是Chomsky2型文法(即上下文无关文法)!";elses5=s5+"该文法是Chomsky3型文法(即正规文法)!";1.3.3判定过程具体的判定算法由各种方法的特点所决定:首先,因为于2型方法与3型文法的产生式的左部都是单个非终结符,所以若待判定方法的左部是单个非终结符,则可确定其为2型或3型方法,此时已将4种方法分为两组,即0型与1型一组、2型与3型一组;其次,对于2型与3型文法,因为3型文法是对2型文法的进一步限制。即2型文法产生式右部是由终结符和非终结符组成的符号串,有以下形式的产生式:A::=ð,其中A属于VN,ð属于终结符和非终结符组成的符号串。而3型文法限制产生式右部是单一终结符或单一终结符跟着单一非终结符,即:A::=a或A::=aB所以,可通过对产生式的右部判断来区分2型与3型文法。最后,对于0型与1型文法,因为0型文法产生式的左部与右部都是符号串,没任何限制,所以可以通过1型文法的限制来区分;1型文法的限制如下所示:α::=β,其中1≤|α|≤|β|且1型文法的左部必须有非终结字符。2.设计2.1数据结构定义了以下字符串类型数据:Strings:用于接受用户输入的文法名与输出最终的完整文法,如:接受输入s="G[N]",输出s="G[N]=({N,D},{0,1,2,3,4,5,6,7,8,9},P,N)"Strings1:用于获取VNcharc[]=s1.toCharArray():用于将s1字符串转换为数组char[]N=newchar[10]:用于保存去除‘,’的纯非终结字符如:输入S,A,B,C则s1=S,A,B,C;c[]={S,A,B,C};N[]={SABC}char[]T=newchar[20]:用于保存纯终结字符如:其中一个产生式规则P为N::=1|2|3|4,则T={1234}Strings2:用于获取产生式规则StringTokenizertokenizer:用于按回车符区分不同产生式,以便按序分别获取产生式char[][]P=newchar[10][20]:用于将产生式规则用二维数组保存Strings4:用于输出产生式规则的字符串Strings5:用于输出判定结果,即输出为哪一类文法若为2型文法,则s5=“该文法是Chomsky2型文法(即上下文无关文法)!”以下是各个控件的定义:privatejavax.swing.JButtonjButton1;确定按钮privatejavax.swing.JButtonjButton2;清空按钮privatejavax.swing.JButtonjButton3;退出按钮静态文本的输出,即在界面上显示输入、输出、方法等提示文字:privatejavax.swing.JLabeljLabel1;privatejavax.swing.JLabeljLabel2;privatejavax.swing.JLabeljLabel3;privatejavax.swing.JLabeljLabel4;privatejavax.swing.JLabeljLabel5;privatejavax.swing.JLabeljLabel6;privatejavax.swing.JLabeljLabel7;privatejavax.swing.JLabeljLabel8;privatejavax.swing.JTextAreajTextArea1;输入产生式规则框privatejavax.swing.JTextAreajTextArea2;输出产生式规则框privatejavax.swing.JTextFieldjTextField1;输入文法名框privatejavax.swing.JTextFieldjTextField2;输入文法的VN的框privatejavax.swing.JTextFieldjTextField3;输出完整文法定义的框privatejavax.swing.JTextFieldjTextField4;输出是哪类文法的框如下图所示: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.判断文法每个产
s3=s3+T[i]+',';//将终结字符串中的字符加上‘,’输出
else
s3=s3+T[i];//终结字符串的最后一个字符不用加‘,’
i++;}
s=s+s3+"},P,"+c[0]+')';
jTextField3.setText(s);
产生式规则的输出用Strings4表示:
for(j=0;j{Strings6=tokenizer.nextToken();s4=s4+s6+'\n';}jTextArea2.setText(s4);对于判定结果的输出,用Strings5表示:Strings5="";//根据算法结果决定输入的文法为哪种类型,则对应给s5赋不同字符串case1:if(flag==1)s5=s5+"该文法是Chomsky0型文法(即短语结构文法)!";elses5=s5+"该文法是Chomsky1型文法(即上下文有关文法)!";dase2:if(flag==1)s5=s5+"该文法是Chomsky2型文法(即上下文无关文法)!";elses5=s5+"该文法是Chomsky3型文法(即正规文法)!";1.3.3判定过程具体的判定算法由各种方法的特点所决定:首先,因为于2型方法与3型文法的产生式的左部都是单个非终结符,所以若待判定方法的左部是单个非终结符,则可确定其为2型或3型方法,此时已将4种方法分为两组,即0型与1型一组、2型与3型一组;其次,对于2型与3型文法,因为3型文法是对2型文法的进一步限制。即2型文法产生式右部是由终结符和非终结符组成的符号串,有以下形式的产生式:A::=ð,其中A属于VN,ð属于终结符和非终结符组成的符号串。而3型文法限制产生式右部是单一终结符或单一终结符跟着单一非终结符,即:A::=a或A::=aB所以,可通过对产生式的右部判断来区分2型与3型文法。最后,对于0型与1型文法,因为0型文法产生式的左部与右部都是符号串,没任何限制,所以可以通过1型文法的限制来区分;1型文法的限制如下所示:α::=β,其中1≤|α|≤|β|且1型文法的左部必须有非终结字符。2.设计2.1数据结构定义了以下字符串类型数据:Strings:用于接受用户输入的文法名与输出最终的完整文法,如:接受输入s="G[N]",输出s="G[N]=({N,D},{0,1,2,3,4,5,6,7,8,9},P,N)"Strings1:用于获取VNcharc[]=s1.toCharArray():用于将s1字符串转换为数组char[]N=newchar[10]:用于保存去除‘,’的纯非终结字符如:输入S,A,B,C则s1=S,A,B,C;c[]={S,A,B,C};N[]={SABC}char[]T=newchar[20]:用于保存纯终结字符如:其中一个产生式规则P为N::=1|2|3|4,则T={1234}Strings2:用于获取产生式规则StringTokenizertokenizer:用于按回车符区分不同产生式,以便按序分别获取产生式char[][]P=newchar[10][20]:用于将产生式规则用二维数组保存Strings4:用于输出产生式规则的字符串Strings5:用于输出判定结果,即输出为哪一类文法若为2型文法,则s5=“该文法是Chomsky2型文法(即上下文无关文法)!”以下是各个控件的定义:privatejavax.swing.JButtonjButton1;确定按钮privatejavax.swing.JButtonjButton2;清空按钮privatejavax.swing.JButtonjButton3;退出按钮静态文本的输出,即在界面上显示输入、输出、方法等提示文字:privatejavax.swing.JLabeljLabel1;privatejavax.swing.JLabeljLabel2;privatejavax.swing.JLabeljLabel3;privatejavax.swing.JLabeljLabel4;privatejavax.swing.JLabeljLabel5;privatejavax.swing.JLabeljLabel6;privatejavax.swing.JLabeljLabel7;privatejavax.swing.JLabeljLabel8;privatejavax.swing.JTextAreajTextArea1;输入产生式规则框privatejavax.swing.JTextAreajTextArea2;输出产生式规则框privatejavax.swing.JTextFieldjTextField1;输入文法名框privatejavax.swing.JTextFieldjTextField2;输入文法的VN的框privatejavax.swing.JTextFieldjTextField3;输出完整文法定义的框privatejavax.swing.JTextFieldjTextField4;输出是哪类文法的框如下图所示: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.判断文法每个产
s4=s4+s6+'\n';}
jTextArea2.setText(s4);
对于判定结果的输出,用Strings5表示:
Strings5="";//根据算法结果决定输入的文法为哪种类型,则对应给s5赋不同字符串
case1:
if(flag==1)s5=s5+"该文法是Chomsky0型文法(即短语结构文法)!
";
elses5=s5+"该文法是Chomsky1型文法(即上下文有关文法)!
dase2:
if(flag==1)s5=s5+"该文法是Chomsky2型文法(即上下文无关文法)!
elses5=s5+"该文法是Chomsky3型文法(即正规文法)!
1.3.3判定过程
具体的判定算法由各种方法的特点所决定:
首先,因为于2型方法与3型文法的产生式的左部都是单个非终结符,所以若待判定方法的左部是单个非终结符,则可确定其为2型或3型方法,此时已将4种方法分为两组,即0型与1型一组、2型与3型一组;
其次,对于2型与3型文法,因为3型文法是对2型文法的进一步限制。
即2型文法产生式右部是由终结符和非终结符组成的符号串,有以下形式的产生式:
A:
=ð,其中A属于VN,ð属于终结符和非终结符组成的符号串。
而3型文法限制产生式右部是单一终结符或单一终结符跟着单一非终结符,即:
=a或A:
=aB
所以,可通过对产生式的右部判断来区分2型与3型文法。
最后,对于0型与1型文法,因为0型文法产生式的左部与右部都是符号串,没任何限制,所以可以通过1型文法的限制来区分;1型文法的限制如下所示:
α:
=β,其中1≤|α|≤|β|
且1型文法的左部必须有非终结字符。
2.设计
2.1数据结构
定义了以下字符串类型数据:
Strings:
用于接受用户输入的文法名与输出最终的完整文法,如:
接受输入s="G[N]",输出s="G[N]=({N,D},{0,1,2,3,4,5,6,7,8,9},P,N)"
Strings1:
用于获取VN
charc[]=s1.toCharArray():
用于将s1字符串转换为数组
char[]N=newchar[10]:
用于保存去除‘,’的纯非终结字符
如:
输入S,A,B,C则s1=S,A,B,C;c[]={S,A,B,C};N[]={SABC}
char[]T=newchar[20]:
用于保存纯终结字符
其中一个产生式规则P为N:
=1|2|3|4,则T={1234}
Strings2:
用于获取产生式规则
StringTokenizertokenizer:
用于按回车符区分不同产生式,以便按序分别获取产生式
char[][]P=newchar[10][20]:
用于将产生式规则用二维数组保存
Strings4:
用于输出产生式规则的字符串
Strings5:
用于输出判定结果,即输出为哪一类文法
若为2型文法,则s5=“该文法是Chomsky2型文法(即上下文无关文法)!
”
以下是各个控件的定义:
privatejavax.swing.JButtonjButton1;确定按钮
privatejavax.swing.JButtonjButton2;清空按钮
privatejavax.swing.JButtonjButton3;退出按钮
静态文本的输出,即在界面上显示输入、输出、方法等提示文字:
privatejavax.swing.JLabeljLabel1;privatejavax.swing.JLabeljLabel2;
privatejavax.swing.JLabeljLabel3;privatejavax.swing.JLabeljLabel4;
privatejavax.swing.JLabeljLabel5;privatejavax.swing.JLabeljLabel6;
privatejavax.swing.JLabeljLabel7;privatejavax.swing.JLabeljLabel8;
privatejavax.swing.JTextAreajTextArea1;输入产生式规则框
privatejavax.swing.JTextAreajTextArea2;输出产生式规则框
privatejavax.swing.JTextFieldjTextField1;输入文法名框
privatejavax.swing.JTextFieldjTextField2;输入文法的VN的框
privatejavax.swing.JTextFieldjTextField3;输出完整文法定义的框
privatejavax.swing.JTextFieldjTextField4;输出是哪类文法的框
如下图所示:
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.判断文法每个产
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1