正规文法转换成正规式.docx
- 文档编号:24648595
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:31
- 大小:57.92KB
正规文法转换成正规式.docx
《正规文法转换成正规式.docx》由会员分享,可在线阅读,更多相关《正规文法转换成正规式.docx(31页珍藏版)》请在冰豆网上搜索。
正规文法转换成正规式
!
f诚诃
f行璧
年级/专业/班:
11级计算机类
(二)班
姓名:
徐勇兵
学号:
E01114278
实验名称:
正规文法转换成正规式
实验目的:
1.了解并熟悉词法分析中单词的描述工具正规文法和正规式表示单词的方式及其之间的差异性和等价性。
2.利用计算机编程实现正规文法转换成等价的正规式。
实验要求:
1.正规文法的输入应简便。
2.输出的正规式以利用3条转换规则得出为标准。
输入:
一组产生式所构成的正规文法。
输出:
对应的等价的正规式。
实验原理:
1.多数程序设计语言的单词的语法都能用正规文法或3型文法来描述。
2.3型文法的特征是P中的每一条规则都有下述形式:
A->aB或A・>a。
正规文法所描述的是VT上的正规集。
3.正规式也称正则表达式,也是表示正规集的工具。
也是我们用以描述单词符号的有效工具。
4.正规文法和正规式的等价性:
一个正规语言可以由正规文法定义,也可以由正规式定义,对任意一个正规文法,存在一个定义同一个语言的正规式;反之,对每个正规式,存在一个生成同一语言的正规文法,有些语言很容易用文法描述,有些语言更容易用正规式定义。
5.将正规文法转换成正规式的转换规则有三:
(1)A->xB,B・>y对应A=xy
(2)A->xA,A・>y对应A二x*y
(3)A->x,A・>y对应A=x|y
实验算法:
实验算法定义一个函数实现转换正规文法为正规式。
函数根据三个转换规则,首先合并形如B・>aA,B・>bA的产生式为B->aA|bA的形式,其中又包括B=A的形式。
然后根据转换规则合并形如S・>a,S・>b的产生式为S->a|b的形式。
再根据转换规则2的A->xA,A・>y对应A=x*y和规则3的A->x,A->y对应A=x|y将文法产生式变换为等价的正规式。
在规则以外还需要另外一个处理,这个处理可以从书本上的例子中看到,即将公因子提取出来,如A=aA|dA变换为A=(a|d)Ao
算法默认开始符号为S且放在第一个产生式,这样就能根据第一条产生式最终得到等价的一个开始符号定义的正规式。
实验结果:
\MyEclipseProtessionaT
终结符输出如下
非终结符输出如下;AA,
产生式输出如下:
S->aA
S->a
A->aA
A->dA
A->d
压缩后的产生式输出如下:
S->aA
A->aA
A->dA
A->a
A->d
A的结果是作d)*(a|d)
对于S分布求出结果是3(a|d)*(a|d)
求5的第M步结果是a(a|d)*(a|d)
theresultis:
(a)|a(a|d)*(a|d)
importjava.util.Vector;
importjavax.swing」OptionPane;
classTools{
publicVector //if(! vs.contains(temp.get(i))) vs.add(temp.get(i)); }//for returnvs; }//publicVector Vector for(inti=O;i newvector.add(vs.get(i)); returnnewvector; } publicVector Vector Vector for(intj=0;j temp.add((String)produce.get(j)); }//forj newvector.add(temp); }//fori returnnewvector; } }//classtools classElements{ Vector Vector while(true) { Strings^OptionPane.showInputDialogfnull/'请输入终结符");if(s==null) {return; }//if end.add(s); }//while (//publicvoidaddend(){//元素添加publicvoidsetnoend(){//非终结符元素添加 while(true) { Strings^OptionPane.showInputDialogfnull/1非请输入终结符");if(s==null) {return; }//if noend.add(s); }//while (//publicvoidaddnoend(){// publicvoidsetproduce(){ while(true) { Strings^OptionPane.showInputDialogfnull/'请输入产生式,隔开”);if(s=二null) return; Vector temp.add(s.split("->")[0]); temp.add(s.split("->")[l]); produce.add(temp); }//while (//publicvoidaddproduce() publicVector returnend; publicVector publicVector } publicvoidrun(){ *TEST******************************* end.addCH);end.addC^11);noend.add(,,Sn); noend.addC'A'1); Vector temp.addC'aA"); produce.add(temp); ^*********************** Vector temp4.add(,,S11); temp4.add(,,aH); produce.add(temp4); //System.out.println(”produce・size()二”+produce.size()); Vector /穴****穴*宣*宣*宣穴*宣*宣穴*穴****穴/ Vector temp2.add(,,a"); produce.add(temp2); Vector temp3.add(,,An); temp3.add("d"); produce.add(temp3); //System.out.println(”produce.size()="+produce・size()); /*noend.add(HBH); Vector temp6.add(,,aBH); produce.add(temp6); Vector tempS.add(,,BH); temp5.add("d"); produce.add(temp5);*/ //this.setend(); //this.setnoend(); //this.setproduce(); } publicbooleanlscontainend(Strings)〃判断某个符号是否是终结符可以是一个字符也可是字符串 {/*System.out.print("输出终结符“); for(inti=O;i System.out.print(end.get(i)); System.out.println(); System.out.printin("传送过来的需要判断的是"+s);*/ intlength=s」ength(); for(inti=O;i { Stringa=H,,+s.charAt(i);if(end.contains(a)) {continue;} elsereturnfalse; }//for returntrue; }//publicbooleanisRGPcontain(Strings) publicbooleanlsNoENd(Strings){//判断某个符号是否是非终结符Stringss=HI,+s.charAt(O); if(! Iscontainend(ss))//如果不含有终结符,则为非终结符returntrue; returnfalse; }//publicboolean publicvoidshow(){ System.out.print(H终结符输出如下: ”); for(inti=O;i System.out.print((String)end.get(i)+,,/"); } System.out.println(H"); System.out.print("非终结符输出如下: "); for(inti=0;i System.out.print((String)noend.get(i)+n,"); } System.out.println(H"); System.out.print("产生式输出如下: "); for(inti=0;i System.out.println(H"); Vector System.out.print((String)temp.get(0)+,,->,,+(String)temp.get(l));} System.out.println(H"); }//classElementsclassCompression{ Toolstools=newTools(); Elementselements; Vector Vector Vector Vector Vector Vector publicvoidshowdelete(Vector unreach,Vector 讦(harm.isEmpty()){ System.out.println("没有有害规则被删除”); } else{ System.out.print("被删除的有害产生式输出如下: "); for(inti=O;i System.out.println(n"); Vector System.out.print((String)temp.get(O)+,,->,,+(String)temp.get(l)); } System.out.println(); Systemoutprintl门(',*)*<*)*<3**]*****]**)*<*)*<**]**)*<*)*<3**]*****]**]**)*<3**]**)*<*)*<**]***")・ } if(unreach.isEmpty()){ System,out.printin(”没有不可到达规则被删除"); } else{ System.out.print("被删除的不可到达产生式输出如下: ");for(inti=O;i System.out.println(HM); Vector System.out.print((String)temp.get(O)+,,->,,+(String)temp.get(l)); } System.out.println(); SystemoutprintlnC1****3**3*****3*******3*****3**3*****3**3***3**3*******3***"). if(unend.isEmpty()){ System.out.println("没有不可终止规则被删除”); } else{ System.out.print("被删除的不可终止产生式输出如下: ");for(inti=0;i System.out.println(H"); Vector System.out.print((String)temp.get(O)+,,->,,+(String)temp.get(l)); } System.out.println(); SystemoutprintlnC1****3**3*****3*******3*****3**3*****3**3***3**3*******3***"). publicVector Vector for(inti=0;i Vector Stringleft=temp.get(O); Stringright=temp.get(l); if(left.equals(right)){//形如A->A newproduce.remove(temp);delete.add(temp); } } returndelete; (//publicVector newproduce){//删除不可到达的规则 booleantag=true; Vector Vector flag.add(start_character); while(tag){ flag.clear(); flag.add(start_character); tag=false; for(inti=0;i Vector Stringleft=temp.get(O); Stringright=temp.get(l); forfintj=O;j Strings=ll"+right.charAt(j); if(elements.lsNoENd(s)) flag.add(s); }//forj }//fori for(inti=0;i Vector Stringleft=temp.get(O); Stringright=temp.get(l); if(flag.contains(left)) continue; else{ tag=true; delete.add(temp); newproduce.remove(temp); } }//for (//while returndelete; }//public publicvoidshownewproduce(){ System.out.print("压缩后的产生式输出如下: "); for(inti=0;i System.out.println(H"); Vector System.out.print((String)temp.get(0)+,,->,,+(String)temp.get(l)); } System.out.println(); publicVector } publicVector returnthis.noend; } publicVector returnthis.end; } classUnEndable{ Vector Vector thenewproduce=tools.doubleprotection(newproduce); //showthenewproduce(); initial_table(); firststep(); secondstep(); thirdstep();showflagtable(); } publicvoidshowthenewproduce(){ System.out.print("最新的产生式输出如下: "); for(inti=0;i System.out.println(n"); Vector System.out.print((String)temp.get(O)+,,->"+(String)temp.get(l)); } System.out.println(); } publicStringwhattag(Stringnoendcharacter){//判断某个非终结符在表中的状态,只有yes,nounsure三种 for(inti=O;i Vector if(temp.get(O).equals(noendcharacter)){ return(String)temp.get⑴; }//if }//for return"error11; }//publicStringwhattag publicvoidinitial_table(){ for(inti=0;i Vector temp.add((String)noend.get(i)); temp.add(Hunsure"); flagtable.add(temp); }//for }//publicvoidinitial_table(){ pub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正规 文法 转换