南昌大学《编译原理》实验报告(用Java编写)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验报告学院:信息工程学院系计算机系专业班级:计算机科学与技术学生姓名:学号:任课教师:目录实验1词法分析程序的设计...................................................................3实验2语法分析程序的设计...................................................................9实验3逆波兰式的翻译和计算.............................................................17南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:实验成绩:实验1词法分析程序的设计一、实验项目名称词法分析程序的设计二、实验目的掌握计算机语言的词法分析程序的开发方法。三、实验基本原理编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。1、根据以下的正规式,编制正规文法,画出状态图;标识符字母(字母|数字字符)*十进制整数0|((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和界符+-*/=();关键字ifthenelsewhiledo2、根据状态图,设计词法分析函数intscan(),完成以下功能:1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2)以二元式形式输出单词单词种类,单词属性其中单词种类用整数表示:0:标识符1:十进制整数2:八进制整数3:十六进制整数运算符和界符,关键字采用一字一符,不编码其中单词属性表示如下:标识符,整数由于采用一类一符,属性用单词表示运算符和界符,关键字采用一字一符,属性为空3、编写测试程序,反复调用函数scan(),输出单词种别和属性。四、主要仪器设备及耗材PC微机DOS操作系统或Windows操作系统TurboC程序集成环境或VisualC++程序集成环境或Java五、实验步骤1、根据正规式,画出状态转换图;2、根据状态图,设计词法分析算法;3、采用C或C++语言,设计函数scan(),实现该算法;4、编制测试程序(主函数main);5、调试程序:读入文本文件,检查输出结果。六、实验数据及处理结果输入数据:编辑一个文本文件program.txt,在文件中输入如下内容:正确结果:ifdata+920x3fthendata=data+01;elsedata=data-01;if,-0,data+,-1,92,-3,3fthen,-0,data=,0,data+,-2,1;,-else,-0,data=,-0,data-,-2,-;,-Java源程序代码如下:packageex_1;importjava.io.BufferedReader;importjava.io.FileReader;importjava.io.IOException;publicclassIdentity{publicstaticvoidmain(String[]args){Stringrecord[]=newString[100];inti=0,n=0;try{BufferedReaderbr=newBufferedReader(newFileReader(C:\\Users\\Administrator\\Desktop\\program.txt));while((record[i]=br.readLine())!=null){n++;i++;}Perhang[]p=newPerhang[n];for(intj=0;jn;j++){p[j]=newPerhang();p[j].readData(record[j]);}}catch(IOExceptione){System.out.print(Error:+e);System.exit(1);}}}classPerhang{Stringkeys[]={if,then,else,while,do};publicintisletter(charchar2){if((char2='a'&&char2='z')||(char2='A'&&char2='Z'))return1;elsereturn0;}publicintisdigit(charchar2){if(char2='0'&&char2='9')return1;elsereturn0;}publicintreverse(StringBufferst){Stringstr=st.toString();intnum=0;for(intj=0;jkeys.length;j++){if(keys[j].compareTo(str)==0)num++;}if(num==0)return0;elsereturn1;}publicintdigitsort(Strings){if(s.charAt(0)=='0'){if(s.charAt(1)=='x')return2;//十六进制elseif(s.charAt(1)='0'&&s.charAt(1)='9')return1;//八进制}elsereturn0;//十进制return0;}publicvoidreadData(Strings){charchar1[]=s.toCharArray();StringBufferst[]=newStringBuffer[20];intnum=0;for(inti=0;ichar1.length;i++){st[num]=newStringBuffer();if(this.isletter(char1[i])==1){while(ichar1.length&&(this.isletter(char1[i])==1||this.isdigit(char1[i])==1)){st[num].append(char1[i]);i++;}i=i-1;if(this.reverse(st[num])==1)System.out.println(+st[num]+,-);//关键字elseSystem.out.println(0,+st[num]+);//变量num++;}elseif(this.isdigit(char1[i])==1){while(ichar1.length&&(this.isdigit(char1[i])==1||this.isletter(char1[i])==1)){st[num].append(char1[i]);i++;}i=i-1;if(this.digitsort(st[num].toString())==0)System.out.println(1,+st[num]+);//十进制elseif(this.digitsort(st[num].toString())==1){st[num].deleteCharAt(0);System.out.println(2,+st[num]+);//八进制}else{st[num].delete(0,2);System.out.println(3,+st[num]+);//十六进制}num++;}elseif(char1[i]=='+')System.out.println(+char1[i]+,-);elseif(char1[i]=='-')System.out.println(+char1[i]+,-);elseif(char1[i]=='*')System.out.println(+char1[i]+,-);elseif(char1[i]=='/')System.out.println(+char1[i]+,-);elseif(char1[i]=='')System.out.println(+char1[i]+,-);elseif(char1[i]=='')System.out.println(+char1[i]+,-);elseif(char1[i]=='(')System.out.println(+char1[i]+,-);elseif(char1[i]==')')System.out.println(+char1[i]+,-);elseif(char1[i]=='=')System.out.println(+char1[i]+,-);elseif(char1[i]==';')System.out.println(+char1[i]+,-);}}}将program.txt文件放在指定路径下,并运行上面的Java源程序,可以得到如下所示的结果截图。七、思考讨论题或体会或对改进实验的建议思考题:1、词法分析能否采用空格来区分单词?答:不能,在词法分析中,处理不光有标识符还有连接符,而连接符和其他的标识符是可以连在一起出现的。如果用空格来区分单词的话,就会使连接符和标识符无法区分。2、程序设计中哪些环节影响词法分析的效率?如何提高效率?答:整个程序都由状态转换图而来。由递归方法实现的状态转换图,影响了整个词法分析器的分析效率,可以考虑使用栈来非递归的实现词法分析。心得体会:1、先利用FileReader读文件,再利用BufferedReader把数据放入缓冲区中2、判断第一个字符,若是关键字或标识符,若是数字,则可能是十进制数或八进制数或十六进制数3、StringBuffer变量可以将检测的字符连接起来,从何判断是关键字还是标识符4、根据十进制,八进制和十六进制之间的差别判断该数属于何种类型八、参考资料高等学校电子信息类规划教材《程序设计语言编译原理》(第3版);陈火旺、刘春林等编著;国防工业出版社南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:实验成绩:实验2语法分析程序的设计一、实验项目名称语法分析程序的设计二、实验目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中算法优先分析方法。三、实验基本原理1、给出文法如下:G[E]E-T|E+T;T-F|T*F;F-i(E);可以构造算符优先表如下:+*()i+*()i2、计算机中表示上述优先关系,优先关系的机内存放方式有两种1)直接存放,2)为优先关系建立优先函数,这里由学生自己选择一种方式;1、给出算符优先分析算法如下:k:=1;S[k]:=‘#’;REPEAT把下一个输入符号读进a中;IFS[k]∈VTTHENj:=kELSEj:=k-1;WHILES[j]aDOBEGINREPEATQ:=S[j];IFS[j-1]∈VTTHENj:=j-1ELSEj:=j-2UNTILS[j]Q把S[j+1]…S[k]归约为某个N;k:=j+1;S[k]:=N;ENDOFWHILE;IFS[j]aORS[j]aTHENBEGINk:=k+1;S[k]:=aENDELSEERRORUNTILa=‘#’1、根据给出算法,利用适当的数据结构实现算符优先分析程序;2、利用算符优先分析程序完成下列功能:1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束;2)读入文本文件中的表达式;3)调用实验2中的词法分析程序搜索单词;4)把单词送入算法优先分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息;5)完成上述功能,有余力的同学可以对正确的表达式计算出结果。四、主要仪器设备及耗材PC微机D

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功