您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 合肥工业大学编译原理实验
宣城校区实验报告课程名称编译原理专业班级计算机0001班学生姓名及学号赵保飞2015216768指导教师李芒宏实验地点计算机中心楼第四机房2017~2018学年第一学期《编译原理》课程实验报告实验名称词法分析设计姓名赵保飞系院专业计算机科学与技术班级计算机01班学号2015216768实验日期2017.10.18指导教师李芒宏成绩一、实验目的和要求通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。二、实验原理(1)实验数据结构说明K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符(2)实验算法描述(3)算法流程图三、源程序代码和测试结果packagelexicalAnalysis;importjava.util.*;importjava.io.*;publicclasslexicalAnalysis{staticStringk[]={for,main,if,while,void,public,static,printf,scanf,asm,do,return,typedef,auto,double,break,short,using,default,long};//关键字staticchars[]={',',';','(',')','[',']','{','}'};//2分界符staticcharm[]={'+','-','*','/'};//3算术运算符staticStringr[]={,=,=,,=,};//4关系运算符ArrayListStringci=newArrayListString();//5常数ArrayListStringid=newArrayListString();//6标识符StringtempToken=;//临时存放组成一个“词”单位串intpint,row=1,line=1;//当前指针指示,行数,列数charch;//存放最新读入源程序字符Stringinstring;//存放输入de源程序代码publicstaticvoidmain(String[]args)throwsException{//TODOAuto-generatedmethodstublexicalAnalysisone=newlexicalAnalysis();System.out.println(单词+\t二元序列+\t类型+\t位置(行,列));one.readtext();}booleanisdigit(charc){//判断所读字符是否为数字,是则返回ture,否则返回falseif(c=48&&c=57)returntrue;elsereturnfalse;}booleanisletter(charc){//判断所读字符是否为字母,是则返回true,否则返回falseif((c64&&c91)||(c96&&c123))returntrue;elsereturnfalse;}booleanisline(charc){//判断字符c是否是下划线_if(c=='_')returntrue;elsereturnfalse;}booleanremove(){//用于在判断关系运算符时,判断是否是要再读一个字符charb=instring.charAt(pint+1);//string类charAt()方法用于返回指定索引处的字符。索引范围为从0到length()-1if(b=='='||b=='')//当其后的字符是=或时,要再读一个字符。否则不要再读。returntrue;elsereturnfalse;}voidclearBlank(){//检查空白直到读入字符非空白while(ch==''){getchar();}}voidgetchar(){pint++;if(pint=instring.length()-1){ch=instring.charAt(pint);if(ch=='\n'){change_row_line();getchar();}}elsech='';//instring数据读取完,需重新读入}voidretract(){//读入前一个字符pint--;ch=instring.charAt(pint);}voiddistinguishLeter(){//识别字符串tempToken=;//清空while(isletter(ch)||isdigit(ch)||isline(ch)){//字母,数字,下划线仍是字符串合法组成,继续识别tempToken=tempToken+ch;getchar();}}voiddistinguishDigit(){//识别数字串tempToken=;//先将strtoken置空while(isdigit(ch)){//当数字时继续识别数字串tempToken=tempToken+ch;//将新识别的字符加到strtoken后getchar();}if(isletter(ch)||isline(ch)){//识别完数字串而其后是字母,下划线时出错处理while(isletter(ch)||isline(ch)||isdigit(ch)){//当是字母,数字,下划线时继续识别错误数字串tempToken=tempToken+ch;//将新识别的字符加到strtoken后getchar();}display(0,tempToken,'');//输出错误数字串tempToken=;//将strtoken置空返回}}voiddisplay(inti,Strings,chara){//各种输出处理switch(i){case-1:System.out.println(a+\tError+\tError+\t+row+,+line+));break;case0:System.out.println(s+\tError+\tError+\t(+row+,+line+));break;case1:System.out.println(s+\t(1,+s+)+\t关键字+\t(+row+,+line+));break;case2:System.out.println(a+\t(2,+a+)+\t分界符+\t(+row+,+line+));break;case3:System.out.println(a+\t(3,+a+)+\t算术运算符+\t(+row+,+line+));break;case4:System.out.println(s+\t(4,+s+)+\t关系运算符+\t(+row+,+line+));break;case5:System.out.println(s+\t(5,+s+)+\t常数+\t+(+row+,+line+));break;case6:System.out.println(s+\t(6,+s+)+\t标识符+\t(+row+,+line+));break;}line++;//列数加一}voidchange_row_line(){//改变行数和列数row++;line=1;}voidhandleString(){//输入串处理pint=-1;//将搜索指示器置-1System.out.println(要处理的语句为:+instring);getchar();//读入一个字符while(pintinstring.length()){//当搜索指示器没有越界时clearBlank();//检查空白直到读入读入非空if(isdigit(ch)){//当ch为数字时进行数字串识别distinguishDigit();//数字串识别if(tempToken.length()!=0){//经过数字串识别后,如果strtoken不为空if(reseverci(tempToken)==-1){//如果strtoken不在ci表中,将strtoken加入ci表中ci.add(tempToken);//将strtoken加入ci表中display(5,tempToken,'');//输出数字串}else{//如果strtoken在ci表中,仅输出display(5,tempToken,'');//输出数字串}}}elseif(isletter(ch)){//当ch为字母时进行字符串识别distinguishLeter();//字符串识别if(reserve(tempToken)==-1){//如果strtoken不在k表中if(reseverid(tempToken)==-1){//如果strtoken不在id表中id.add(tempToken);//将strtoken加入id表中display(6,tempToken,'');//输出标识串}else{//如果strtoken在id表中display(6,tempToken,'');//输出标识串}}else{//如果strtoken在关键字表display(1,tempToken,'');//输出关键字}}elseif(in_s(ch)!=-1){//分界符处理包含在one.in_s(one.ch)中}elseif(in_m(ch)!=-1){//算术运算符处理包含在one.in_m(one.ch)中}elseif(in_k(ch)!=-1){//关系运算符处理包含在one.in_k(one.ch)中}else{display(-1,,ch);//errorgetchar();//读下一位}}}intreserve(Strings){//判断字符串是否是保留字inti;for(i=0;ik.length;i++){if(s.equals(k[i])){returni;//是保留字,就返回编码}}return-1;//不是保留字,就返回-1}intreseverid(Strings){//判断识别的标志符是否已经在id表中inti;for(i=0;iid.size();i++){if(s.equals(id.get(i)))returni;//识别的标志符已经在id表中,返回位置}return-1;//识别的标志符不在id表中,返回-1}intreseverci(Strings){//判断识别的数字串是否已经在ci表中inti;for(i=0;ici.size();i++){if(s.equals(ci.get(i)))returni;//识别的数字串已经在ci表中,返回位置}return-1;//识别的数字串不在ci表中,返回-1}intin_s(charc){//确认分界符inti;for(i=0;is.length;i++)if(c==s[i]){//与某个分界符配备时display(2,,c);//输出分界符getchar();//读下一位returni;//返回所在位置}return-1;//不在分界符表中}intin_m(charc){//查找算术运算符inti;for(i=0;im.length;i++)if(c==m[i]){//与某个算术运算符配备时display(3,,c);//输出算术运算符getchar();//读下一位returni;//返回所在位置}return-1;//不在算术运算符表中}intin_k(charb){//查找关系运算符inti;if(remove()==false){//读下一位为假时,进行一位关系运算符识别for(i=0;ir.length;i++)if(r[i].length()==1){//当关系运算符为一位时,尝试匹配if(r[i].equals(Character.toString(b))){display(4,r
本文标题:合肥工业大学编译原理实验
链接地址:https://www.777doc.com/doc-5628755 .html