您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 综合/其它 > 武汉理工大学编译原理实验报告
武汉理工大学学生实验报告书实验课程名称编译原理开课学院计算机科学与技术学院指导老师姓名饶文碧学生姓名学生专业班级软件zy13022015—2016学年第1学期学生学号实验课成绩-1-实验课程名称:编译原理实验项目名称单词的词法分析程序设计实验成绩实验者专业班级软件zy1302组别同组者实验日期2015年12月29日第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)1.问题描述:对于常用高级语言(如Pascal、C语言)的各类单词进行词法分析。2.实验内容:完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。3.实验要求:(1)选择常用高级程序设计语言(如Pascal、C语言、PL/0语言)的源程序作为词法分析对象。(2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。二、实验设计(包括实验方案设计,实验手段的确定,实验步骤,实验过程等,用硬件逻辑或者算法描述)Token.java:publicclassToken{privateinttokenType;//单词种别码privateStringtokenValue;//单词值publicToken(inttokenType,StringtokenValue){this.tokenType=tokenType;this.tokenValue=tokenValue;}publicintgetTokenType(){returntokenType;}-2-publicStringgetTokenValue(){returntokenValue;}}TokenTable.java:publicclassTokenTable{privatestaticHashMapString,IntegeridentifierOrNumberTable=newHashMap();//标识符或数值-标识符或数值种别码privatestaticHashMapString,IntegerkeywordTable=newHashMap();//关键字-关键字种别码privatestaticHashMapString,IntegerdelimiterTable=newHashMap();//界符-界符种别码privatestaticHashMapString,IntegeroperatorTable=newHashMap();//运算符-运算符种别码static{identifierOrNumberTable.put(error,0);identifierOrNumberTable.put(identifier,1);identifierOrNumberTable.put(number,2);keywordTable.put(char,3);keywordTable.put(int,4);keywordTable.put(float,5);keywordTable.put(double,6);keywordTable.put(void,7);keywordTable.put(main,8);keywordTable.put(if,9);keywordTable.put(else,10);keywordTable.put(for,11);keywordTable.put(while,12);keywordTable.put(do,13);keywordTable.put(switch,14);keywordTable.put(break,15);keywordTable.put(continue,16);keywordTable.put(return,17);delimiterTable.put({,18);delimiterTable.put(},19);delimiterTable.put([,20);delimiterTable.put(],21);delimiterTable.put((,22);delimiterTable.put(),23);delimiterTable.put(,,24);-3-delimiterTable.put(;,25);operatorTable.put(,26);operatorTable.put(=,27);operatorTable.put(,28);operatorTable.put(=,29);operatorTable.put(==,30);operatorTable.put(=,31);operatorTable.put(+,32);operatorTable.put(-,33);operatorTable.put(*,34);operatorTable.put(/,35);operatorTable.put(+=,36);operatorTable.put(-=,37);operatorTable.put(*=,38);operatorTable.put(/=,39);}publicstaticbooleancontainsKeyword(Stringkeyword){returnkeywordTable.containsKey(keyword);}publicstaticbooleancontainsDelimiter(Stringdelimiter){returndelimiterTable.containsKey(delimiter);}publicstaticIntegergetTokenType(Stringkey){returnoperatorTable.containsKey(key)?operatorTable.get(key):(delimiterTable.containsKey(key)?delimiterTable.get(key):(keywordTable.containsKey(key)?keywordTable.get(key):(identifierOrNumberTable.containsKey(key)?identifierOrNumberTable.get(key):null)));}}Lexer.java:publicinterfaceLexer{/***对给定路径的文本文件中的文本,进行词法分析,返回可迭代的单词*集合。*@parampath要进行词法分析的文本文件的路径-4-*@return可迭代的单词集合*@throwsException抛出所有异常(这么做是为了代码清晰,唉)*/IterableTokenscan(Stringpath)throwsException;}LexerImpl.java:publicclassLexerImplimplementsLexer{@OverridepublicListTokenscan(Stringpath)throwsException{ListTokentokens=newArrayList();Pathfile=Paths.get(path);BufferedReaderin=Files.newBufferedReader(file);Stringline;while((line=in.readLine())!=null){intindex=0;//若单词是一个以上的字符组成,此下标就会起作用for(inti=0;iline.length();i++){//标识符或关键字if(Character.isLetter(line.charAt(i))){index=i+1;while(indexline.length()&&Character.isLetterOrDigit(line.charAt(index))){index++;}Stringkey=line.substring(i,index);if(TokenTable.containsKeyword(key)){Tokentoken=newToken(TokenTable.getTokenType(key),key);tokens.add(token);}else{Tokentoken=newToken(TokenTable.getTokenType(identifier),key);tokens.add(token);}-5-i=index-1;}//整型非负数值elseif(Character.isDigit(line.charAt(i))){index=i+1;booleanerror=false;while(indexline.length()&&Character.isLetterOrDigit(line.charAt(index))){if(!error&&Character.isLetter(line.charAt(index))){error=true;}index++;}StringtokenType=error?error:number;Tokentoken=newToken(TokenTable.getTokenType(tokenType),line.substring(i,index));tokens.add(token);i=index-1;}//界符elseif(TokenTable.containsDelimiter(String.valueOf(line.charAt(i)))){Stringdelimiter=String.valueOf(line.charAt(i));Tokentoken=newToken(TokenTable.getTokenType(delimiter),delimiter);tokens.add(token);}//以下都是运算符..//运算符或=elseif(line.charAt(i)==''){index=i+1;if(line.charAt(index)=='='){StringlessThanOrEqual=line.substring(i,index+1);Tokentoken=newToken(TokenTable.getTokenType(lessThanOrEqual),lessThanOrEqual);tokens.add(token);-6-i=index;}else{StringlessThan=(line.substring(i,index));Tokentoken=newToken(TokenTable.getTokenType(lessThan),lessThan);tokens.add(token);}}//运算符或=elseif(line.charAt(i)==''){index=i+1;if(line.charAt(index)=='='){StringgreaterThanOrEqual=line.substring(i,index+1);Tokentoken=newToken(TokenTable.getTokenType(greaterThanOrEqual),greaterThanOrEqual);tokens.add(token);i=index;}else{StringgreaterThan=(line.substring(i,index));Tokentoken=newToken(TokenTable.getTokenType(greaterThan),greaterThan);tokens.add(token);}}//运算符=或==elseif(line.charAt(i)=='='){ind
本文标题:武汉理工大学编译原理实验报告
链接地址:https://www.777doc.com/doc-3749876 .html