您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理实验报告--词法分析器
编译原理实验—词法分析器一、实验目的通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。二、实验内容及要求对某特定语言A,构造其词法规则。该语言的单词符号包括:保留字(见左下表)、标识符(字母大小写不敏感)、整型常数、界符及运算符(见右下表)。功能要求如下所示:·按单词符号出现的顺序,返回二元组序列,并输出。·出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。·如果出现词法错误,报出:错误类型,位置(行,列)。·处理段注释(/**/),行注释(//)。·有段注释时仍可以正确指出词法错误位置(行,列)。三、实验过程1、词法形式化描述使用正则文法进行描述,则可以得到如下的正规式:其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。A→(ID|NUM|RES|DEL|OPR)*ID→letter(letter|didit)*NUM→digitdigit*letter→a|…|z|A|…|Zdigit→0|…|9RES→program|begin|end|var|int|and|or|not|if|then|else|while|doDEL→(|)|.|;|,OPR→+|*|:=|||=|=|=|如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。2、单词种别定义;A语言中的单词符号及其对应的种别编码如下表所示:单词符号种别编码单词符号种别编码program1+16begin2*17end3(18var4)19int5,20and6.21or7:=22not8;23if924then1025else11=26while12=27do13=28标识符1429整型常量15-303、状态转换图;语言A的词法分析的状态转换图如下所示:空格符,制表符或回车符字母或数字数字非字母或数字2字母01非数字3+数字563113*7(8)410.9,12:13)14非==4、运行环境介绍;本次实验采用MyEclipse进行代码的编写和编译及运行,编写语言为java语言;程序的运行环境为windows7旗舰版5、关键算法的流程图及文字解释;程序中用到的函数列表:25其他A类定义各种类函数以及包含主函数publicstaticvoidmain()变量ch储存当前最新读进的字符的地址strToken存放当前字符串main()//主函数Analysis()//分析函数,每次读入一行文件,进行识别处理;charGetChar();//取得当前位置的字符的内容放入ch,并提前指向下一个字符;charGetNextChar();//取得当前位置的下一位置的字符,StringConCat();//将ch指向的字符连接到strToken后面isLetter();//判断ch指向的字符是否字母isDigit();//判断ch指向的字符是否数字add(p,str);//向p表中插入当前strToken的字符串BooleanfindKeyWord(str);//检测当前strToken中的字符串是否保留字,若是,则执行getKeyWordKey(str),返回保留字的id,否则,判别其是否是已存在的标示符,若是,返回标示符的id以及该标示符在表中的位置;findPunctuation()//判断是否是一个保留的符号;getindex()//返回已经识别的标示符或者是数字的位置下标;Booleanexist();//检测当前strToken中的字符串是否在标识符表中已存在,若是,则返回true,否则返回falsevoidcallError();//出错处理过程,将错误的位置报告出来(1)main()函数的流程图如下:(2)具体分析流程图:开始类初始化,变量的初始化,准备执行main()函数调用Analyse()函数分析输出结果表结束Analyse(str)函数读取第一个字符赋给变量Ch判断ch内容?继续判读IndexoutofBound6、测试报告(测试用例,测试结果);首先输入一个不含错误的程序(两种注释)进行检测:运行后在控制台上得到的结果如下所示:得到的二元组序列如下:经检验,输出的是正确的二元组序列。再输入一个含有错误的程序(含有注释)进行检验:运行后在控制台上得到的结果如下所示:经检验,错误的位置是正确的如果是空文件,编译也会通过;四、实验总结通过本次试验,我加深了对编译原理中的词法分析的理解,同时通过动手,更加锻炼了自己。本次试验由于使用的刚刚学习的java语言,通过这次机会加强了自己对java语言的熟悉的使用。在这次试验中,感谢老师的认真的讲解与同学的无私的帮助。总结来说,自己在这次试验中收获很大。附:以下为本次实验的源代码:packageAnalysis;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Map;publicclassA{privatestaticcharch;privatestaticStringstrToken;privatestaticintindex=0;privatestaticintline=1;privatestaticbooleannoteTag=false;privateMapInteger,Stringkeywords;privateHashMapString,Integerpunctuations;privatestaticArrayListStringp=newArrayListString();privatestaticArrayListStringq=newArrayListString();//getandset函数publicchargetCh(){returnch;}publicvoidsetCh(charch){A.ch=ch;}publicStringgetStrToken(){returnstrToken;}publicvoidsetStrToken(StringstrToken){A.strToken=strToken;}publicvoidsetPunctuations(HashMapString,Integerpunctuations){this.punctuations=punctuations;}publicMapString,IntegergetPunctuations(){returnpunctuations;}publicvoidsetKeywords(MapInteger,Stringkeywords){this.keywords=keywords;}publicMapInteger,StringgetKeywords(){returnkeywords;}//构造函数publicA(){this.keywords=newHashMapInteger,String();keywords.put(1,Program);keywords.put(2,begin);keywords.put(3,end);keywords.put(4,var);keywords.put(5,int);keywords.put(6,and);keywords.put(7,or);keywords.put(8,not);keywords.put(9,if);keywords.put(10,then);keywords.put(11,else);keywords.put(12,while);keywords.put(13,do);this.punctuations=newHashMapString,Integer();punctuations.put(+,16);punctuations.put(*,17);punctuations.put((,18);punctuations.put(),19);punctuations.put(,,20);punctuations.put(;,21);punctuations.put(:=,22);punctuations.put(,23);punctuations.put(=,24);punctuations.put(,25);punctuations.put(=,26);punctuations.put(.,27);punctuations.put(,28);punctuations.put(=,29);}//函数定义(词法分析函数)publicbooleanAnalyse(char[]strArray){index=0;//每次分析一行完成后就将index置0chartemp1;introwLength=strArray.length;outer:while(indexrowLength){strToken=;ch=GetChar(strArray);if(ch==';'){System.out.println((21,;));}elseif(ch==':'){index++;System.out.println((22,:=));}elseif(ch=='.'){System.out.println((27,.));}elseif(ch==''){if((temp1=this.getNextChar(strArray))=='=')System.out.println((24,=));else{index--;System.out.println((23,));}}elseif(ch==''){if((temp1=this.getNextChar(strArray))=='=')System.out.println((26,=));elseif(temp1=='')System.out.println((28,));else{index--;System.out.println((25,));}}elseif(ch=='*'&¬eTag==false){System.out.println((17,*));}elseif(java.lang.Character.isLetter(ch)&¬eTag==false){strToken=contact(strToken,ch);ch=getNextChar(strArray);while((java.lang.Character.isLetter(ch))||(java.lang.Character.isDigit(ch))){strToken=contact(strToken,ch);ch=getNextChar(strArray);}index--;//System.err.println(!!!+strToken);if(findKeyword(strToken)){//System.out.println((15,+strToken.toString()+)\n);inti=getKeyWordKey(strToken);System.out.println((+i+,--));}else{if(!exist(p,strToken))p.add(strToken);inti=getindex(p,strToken);//System.out.println((14,+strToken.toString()+)\n);System.out.println((14,+i+
本文标题:编译原理实验报告--词法分析器
链接地址:https://www.777doc.com/doc-5835335 .html