编译原理实验报告册

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

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

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

资源描述

1专业:软件工程班级:2013级3班学号:姓名:雷涛实验报告2015至2016学年第2学期编译原理计算机科学学院2实验报告说明本课程实验从开课学期第9周开始,每周2学时上机实验课,第16周结束,其中第16周为实验检测,共14学时。除统一安排的时间外,学生还可根据自己的实际适当安排课余时间上机。实验课注意事项如下:(1)每次实验前学生必须充分准备..每次的实验内容,以保证每次上机实验的效果。实验过程中必须独立..完成。(2)每次实验课将考勤..,并作为实验成绩的重要依据。(3)每次实验完成后,及时撰写实验报告并交实验指导老师批阅。(4)实验报告中学生必须填写【实验地点....】、【实验时间....】、【实验过程....】以及【实.验总结...】,注意:必须手写..完成,并独立撰写实验总结,严禁抄袭。(5)每次实验完成后,请将实验结果发送到...教师指定邮箱(jkxllj@qq.com)。(6)学期结束时,每位同学应将自己的《实验报告册》交各班级班长或学习委员,由班长或学习委员以班级为单位、按学号从小到大排列........好统一交给实验指导老师,否则无实验成绩。附实验成绩登记表实验名称实验一实验二实验成绩3实验名称:一个简单词法分析器的设计与实现指导教师:刘丽娟实验地点:新实验楼项目一实验室实验日期:2016年5月10日成绩:实验目的:1.了解词法分析的任务;2.掌握词法分析程序的工作流程。实验内容:定义模拟的简单语言的词法构成,编制词法分析程序,要求将用模拟语言书写的源程序进行词法分析,输出源程序清单,Token文件和错误信息文件。若有错误,必须输出错误在源程序中行号和列号,并将符号表和字符串以文件的形式写出来。基本要求:1.写出该实验的实验步骤;2.写出实验中遇到的问题及解决的方法。实验步骤:1,分析关键字(语言保留标识符等)2,定义模拟的简单语言的词法构成3,将关键字装入HashMap中4,读入要分析的程序文件5,词法分析6,将分析结果tokens保存到List集合中7,输出tokens到文件中核心代码:关键字:publicclassKeyWords{publicStringkeyWord=;publicKeyWords(StringkeyWord){this.keyWord=keyWord;}publicStringtoString(){returnthis.keyWord;}/**列举写关键字*/4publicstaticfinalKeyWordsand=newKeyWords(&&),or=newKeyWords(||),equal=newKeyWords(==),For=newKeyWords(for),Do=newKeyWords(do),……privatestaticListKeyWordskeyWordsLists=newArrayListKeyWords();/**向外界提供对象集合*/publicstaticListKeyWordsgetKeyWordsLists(){keyWordsLists.add(and);keyWordsLists.add(or);keyWordsLists.add(equal);keyWordsLists.add(For);keyWordsLists.add(Do);……returnkeyWordsLists;}}数据类型:publicclassDataTypeextendsKeyWords{publicStringdataType=;publicDataType(Strings){super(s);this.dataType=s;}/**八种基本数据类型*/publicstaticfinalDataTypeInt=newDataType(int),Float=newDataType(float),……privatestaticListDataTypedataTypeLists=newArrayListDataType();/**向外界提供对象集合*/publicstaticListDataTypegetDataTypeLists(){dataTypeLists.add(Boolean);dataTypeLists.add(Float);……returndataTypeLists;}publicStringtoString(){5returnthis.dataType;}}词法分析引擎:publicclassLexicalAnalysis{/**下一个读入字符*/charnextChar='';/**将KeyWords对象装在hashMap中*/privateHashMapString,StringkeyWords=newHashMapString,String();/**将DataTypes对象装在hashMap中*/privateHashMapString,StringdataTypes=newHashMapString,String();/**token序列(遍历过程中所有字符串的分割列表,以便于保存到文件中)*/privateListStringtokenLists=newLinkedListString();/**读取文件变量*/BufferedReaderreader=null;/**保存当前是否读取到了文件的结尾*/privateBooleanisEnd=false;/**记录行号*/publicstaticintlineNum=1;/**将保存keyWords对象保存到HashMap中便于查询(其实key==value)*/voidreserve(KeyWordsw){keyWords.put(w.keyWord,w.toString());}/**装数据类型*/voidreservedataTypes(DataTyped){dataTypes.put(d.dataType,d.toString());}/***构造函数中将关键字和类型添加到hashtablewords中*/publicLexicalAnalysis(StringfilePath){/*初始化读取文件变量*/try{reader=newBufferedReader(newFileReader(filePath));//读入文件}catch(IOExceptione){System.out.print(e);}/*关键字对象*/ListKeyWordslist1=KeyWords.getKeyWordsLists();6for(KeyWordsk:list1){this.reserve(k);}/*数据类型*/ListDataTypelist=DataType.getDataTypeLists();for(DataTypedataType:list){this.reserve(dataType);this.reservedataTypes(dataType);}}publicvoidreadChar()throwsIOException{/*这里应该是使用的是*/nextChar=(char)reader.read();if((int)nextChar==0xffff){//标志文件已读完this.isEnd=true;}}publicBooleanreadChar(charch)throwsIOException{readChar();if(this.nextChar!=ch){returnfalse;}this.nextChar='';returntrue;}publicvoidscan()throwsIOException{/*消除空白*/for(;;readChar()){if(nextChar==''||nextChar=='\t'){continue;}elseif(nextChar=='\n'){tokenLists.add(第--+lineNum+--行);lineNum=lineNum+1;}elsebreak;}/*下面开始分割关键字,标识符等信息*/switch(nextChar){/*对于==,=,=,!=的区分使用状态机实现*/case'=':if(readChar('=')){tokenLists7.add(==+-------------------------KeyWords);break;}else{tokenLists.add(=+--------------------------KeyWords);break;}case'':if(readChar('=')){tokenLists.add(=+--------------------------KeyWords);break;}else{tokenLists.add(+--------------------------KeyWords);break;}case'':if(readChar('=')){tokenLists.add(=+-------------------------KeyWords);break;}else{tokenLists.add(+--------------------------KeyWords);break;}case'!':if(readChar('=')){tokenLists.add(!=+--------------------------KeyWords);break;}else{tokenLists.add(!+--------------------------KeyWords);break;}case'(':if(readChar('(')){tokenLists.add((+-------------------------KeyWords);break;}case')':if(readChar(')')){tokenLists.add()+------------------------KeyWords);break;}8}/**下面是对数字的识别,根据文法的规定的话,这里的数字只要是能够识别整数就行isDigit确定指定字符(Unicode代码点)是否为数字。*/if(Character.isDigit(nextChar)){intvalue=0;do{value=10*value+Character.digit(nextChar,10);readChar();}while(Character.isDigit(nextChar));tokenLists.add(value+--------------------------Number);return;}/**关键字或者是标识符的识别isLetter确定指定字符是否为字母*/if(Character.isLetter(nextChar)){StringBuffersb=newStringBuffer();/*首先得到整个的一个分割*/do{sb.append(nextChar);readChar();}while(Character.isLetterOrDigit(nextChar));//isLetterOrDigit确定指定字符是否为字母或数字/*判断是关键字还是标识符*/Strings=sb.toString();Stringdatatype=dataTypes.get(s);/*如果是关键字或者是类型的话,w不应该是空的*/if(s!=null){if(datatype!=null){tokenLists.add(datatype+--------------------------DataType);return;}tokenLists.add(s);return;/*说明是关键字或者是类型名*/}/*否则就是一个标识符id*/tokenLists.add(s);keyWords.put(s,s);re

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

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

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

×
保存成功