实验-编译原理预测分析表方法试验报告_第1页
实验-编译原理预测分析表方法试验报告_第2页
实验-编译原理预测分析表方法试验报告_第3页
实验-编译原理预测分析表方法试验报告_第4页
全文预览已结束

下载本文档

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

文档简介

实验7-8预测分析表方法一、实验目的理解预测分析表方法的实现原理。二、实验内容:编写一通用的预测法分析程序,要求有一定的错误处理能力,出错后能够使程序继续运行下去,直到分析过程结束。可通过不同的文法(通过数据表现)进行测试。三.实验要求:给定算术表达式文法,编写程序,测试数据。算术表达式文法E→TE’E’→+TE’|-TE’|εT→FT’T’→*FT’|/FT’|%FT’|εF→(E)|id|num四.实验过程:1.实验代码:importjava.io.*;importjavax.swing.JOptionPane;publicclasspredict{ int length_vn=5,length_vt=10; staticinti,j,i1=0,e_flag=0;publicpredict(){} staticStringVN[]={"E","e","T","t","F"}; staticString staticStringCS[]={"Te","+Te","-Te","$","Ft","*Ft","/Ft","%Ft","","(E)","d","n"}; staticStringfollow[][]={{"#",")"},{"#",")"},{"#",")","+","-"},{"#",")","+","-"},{"#",")","+","-","*","/","%"}};staticintanalysis_table[][]={{-1,-1,-1,-1,-1,0,-1,0,0,-1},{1,2,-1,-1,-1,-1,3,-1,-1,3},{-1,-1,-1,-1,-1,4,-1,4,4,-1},{8,8,5,6,7,-1,8,-1,-1,8},{-1,-1,-1,-1,-1,9,-1,10,11,-1}};publicvoidlocate(Stringvn,Stringvt){ for(inta=0;a<5;a++){ if(VN[a].equals(vn)){ i=a;break; } elsei=-1; } for(intb=0;b<10;b++){ if(VT[b].equals(vt)){ j=b;break; } elsej=-1; }}publicvoidequal(intvn,intvt){ Stringcs=""; if(analysis_table[vn][vt]==-1) { inta; for(a=0;a<follow[vn].length;a++) { if(follow[vn][a].equals(VT[vt]))break; } if(a<follow[vn].length)error1(); elseerror2(vt); } else{ cs=CS[analysis_table[vn][vt]]; intcs_length=cs.length(); charachar[]=newchar[cs_length]; charbchar[]=newchar[cs_length]; cs.getChars(0,cs_length,achar,0); for(inta=0,b=cs_length-1;a<cs_length;a++,b--){ bchar[b]=achar[a]; } Stringnewstr=newString(bchar); in_Stack(newstr); }}publicvoiderror1(){ System.out.println("出错,弹出栈顶符号");}publicvoiderror2(intvt){ System.out.println("出错,跳过"+VT[vt]); in_Stack(VN[i]); i1++; }publicvoiderror3(Stringstr){ System.out.println("错误,不匹配终结符"+str); i1++; }publicvoidin_Stack(Stringstr){ try{ FileWriterfw=newFileWriter("test.txt",true); PrintWriterpw=newPrintWriter(fw); pw.write(str); pw.close(); fw.close(); }catch(IOExceptionef){}}publicStringout_Stack(){ Stringc=""; try{Readerdu=newFileReader("test.txt");BufferedReaderbr=newBufferedReader(du); c=br.readLine(); br.close(); du.close(); Filef1=newFile("test.txt"); f1.delete(); }catch(IOExceptioneio){} c=c.trim(); Stringsub_str=c.substring(0,c.length()-1); in_Stack(sub_str); Stringzhand=c.substring(c.length()-1,c.length()); returnzhand;}publicstaticvoidmain(Stringargs[]){ Filef=newFile("test.txt"); f.delete(); predictpd=newpredict(); Stringfenxi; Stringinput=JOptionPane.showInputDialog("请输入算术表达式:"); input=input.trim(); chargchar[]=newchar[1]; pd.in_Stack("#E"); fenxi="E"; while(i1<input.length()){ inta,b,c; fenxi=pd.out_Stack(); System.out.println("------------------------------------------------"); System.out.print("栈顶元素:"+fenxi+'\t'); input.getChars(i1,i1+1,gchar,0); Stringvt=newString(gchar); vt=vt.trim(); System.out.print("当前单词记号:"+vt+"\t"); for(c=0;c<10;c++){ if(VT[c].equals(fenxi))break; } for(a=0;a<5;a++){ if(VN[a].equals(fenxi)){ System.out.print("展开非终结符"+fenxi+"->"); for(b=0;b<10;b++){ if(VT[b].equals(vt)&&analysis_table[a][b]!=-1){ System.out.print(CS[analysis_table[a][b]]+"\n");break; } } } } if(c<10&&!fenxi.equals(vt))pd.error3(fenxi); if(fenxi.equals(vt)){ System.out.println("匹配终结符"+fenxi+'\t'); i1++; } else{ pd.locate(fenxi,vt); pd.equal(i,j); } } System.out.println("结束");}}2.试验测试:给定一符合该文法的句子,如d+n/d,运行预测分析程序,给出分析过程和每一步的分析结果,输出形式如下图:给定一不符合该文法的句子,如dd**n,运行预测分析程序,给出分析和每一步的分析过程,并给出对错误的处理分析过程,输出形式如下图:四、实验总结:1.本次通过试验,我学会了预测分析表的构造方法,即给文法的正规式编号:存放在字符数组中,从0开始编号,正规式的编号即为该正规式在数组中对应的下标。2.明白了错误处理机制,紧急方式的错误恢复方法(抛弃某些符号,继续向下分析)(1)栈顶为非终结符A,串中当前单词属于FOLLOW(A),则从栈中弹出A(此时可认为

温馨提示

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

评论

0/150

提交评论