JAVA语言编写的编译原理FIRST和FOLLOW集.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:14 大小:44KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

JAVA语言编写的编译原理FIRST和FOLLOW集.doc

JAVA语言编写的编译原理FIRST和FOLLOW集.doc

预览

免费试读已结束,剩余 4 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

packagecn.spy.action;importjava.util.ArrayList;importjava.util.Scanner;importjava.util.StringTokenizer;*某一输入实例:*E->TE'*E'->+E|ε*T->FT'*T'->T|ε*F->PF'*F'->*F'|ε*P->(E)|a|b|^*end*/publicclassFirstFollow3{publicArrayList<String[]>in=newArrayList<String[]>();//这数据结构真是逼人绝路才去想到绝处逢生,哈哈,关键实现了可变长度文法接收,在这存放的是拆分后最简单的文法,也是由用户输入publicArrayList<String[]>first=newArrayList<String[]>();//包括左推导符和其First集publicArrayList<String[]>follow=newArrayList<String[]>();publicArrayList<String[]>track=newArrayList<String[]>();//track有一条一条的非终结符串组成的路径数组publicFirstFollow3(){Scannersc=newScanner(System.in);System.out.println("请分行输入一个完整文法:(end结束)");Stringsline="";sline=sc.nextLine();while(!sline.startsWith("end")){StringBufferbuffer=newStringBuffer(sline);intl=buffer.indexOf("");while(l>=0){//去空格buffer.delete(l,l+1);l=buffer.indexOf("");}sline=buffer.toString();Strings[]=sline.split("->");//左推导符if(s.length==1)s=sline.split("→");//考虑到输入习惯和形式问题if(s.length==1)s=sline.split("=>");if(s.length==1){System.out.println("文法有误");System.exit(0);}StringTokenizerfx=newStringTokenizer(s[1],"|︱");//按英文隔符拆开产生式或按中文隔符拆开while(fx.hasMoreTokens()){String[]one=newString[2];//对于一个语句只需保存两个数据就可以了,语句左部和语句右部的一个简单导出式,假如有或符,就按多条存放one[0]=s[0];//头不变,0位置放非终结符one[1]=fx.nextToken();//1位置放导出的产生式,就是产生式右部的一个最简单导出式in.add(one);}sline=sc.nextLine();}//求First集过程this.process("First");/**打印First集算法和First集*/System.out.println("\nFirst集算法:");this.print(track);//打印First集算法System.out.println("\nFirst集:");for(inti=0;i<first.size();i++){String[]r=first.get(i);System.out.print("First("+r[0]+")={");for(intj=1;j<r.length;j++){System.out.print(r[j]);if(j<r.length-1)System.out.print(",");}System.out.println("}");}track.clear();//因为下面还要用,这里就先清空了//求Follow集过程this.process("Follow");System.out.println("\nFollow集算法:");for(inti=0;i<track.size();i++){String[]one=track.get(i);System.out.print("Follow("+follow.get(i)[0]+"):\t");for(intj=0;j<one.length;j++)System.out.print(one[j]+"\t");System.out.println();}System.out.println("\nFollow集:");for(inti=0;i<follow.size