您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理词法分析器的构造
实验报告(2014/2015学年第一学期)课程名称编译原理实验名称词法分析器的构造实验时间2015年4月10日指导单位南京邮电大学指导教师蒋凌云学生姓名孙雪禄班级学号B12041213学院(系)计算机学院、软件学院专业软件工程(服务外包)-2-实验报告实验名称词法分析器的构造指导教师蒋凌云实验类型上机实验实验学时4实验时间2015.4.10一、实验目的和要求设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。二、实验环境(实验设备)MicrosoftVisualStdio2010-3--4-二、实验原理及内容1、实验内容:设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。例如下面为一段C语言源程序:main(){inta,b;a=10;b=a+20;}要求输出如下(可以自行分类,分类原则请在报告中说明)(1,’main’)(5,’(’)(5,’)’)(5,’{’)(1,’int’)(2,’a’)(5,’,’)(2,’b’)(5,’;’)(2,’a’)(4,’=’)-5-(3,’10’)(5,’;’)(2,’b’)(4,’=’)(2,’a’)(4,’+’)(3,’20’)(5,’;’)(5,’}’)2、实验要求:(1)、允许用户自己输入源程序并保存为文件(2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等)(3)、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:识别保留字:if、int、for、while、do、return、break、continue等,其他的都识别为标识符;常数为无符号整形数;运算符包括:+、-、*、/、=、、、=、=、!=等;分隔符包括:,、;、{、}、(、)等。(4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。文本内容为待分析的类C语言程序。3、实验过程描述(1)首先讲和书上一样分成5类分类号分类内容1保留字-6-2标识符3整数4运算符(+,-,*,/,,,=等)5分隔符(,,;,{,},(,))(2)、接着写出用到的简单文法并转换成状态转换图标识符::=字母|字母标识符|标识符数字整数::=数字|数字整数运算符::=+|-|*|||=分隔符::=,|;|(|)|{|}保留字是一种特殊的标识符,不独立写出其文法状态转换图如下:0⑤⑥31②④字母非数字或字母字母或数字数字数字非数字+-*/=,;(){}0⑤⑥31②④字母非数字或字母字母或数字数字数字非数字+-*/=,;(){}-7-(3)按照书上的步骤写程序因为程序要求将用户的输入保存到文件中所以这里要用到文件存贮操作,fopen(FILE*文件名,打开方式)。一共有三个函数分别是boolLETTER(charA)//判断字符是否是字母{if(A='a'&&A='z')returntrue;elseif(A='A'&&A='Z')returntrue;elsereturnfalse;}boolDIGIT(charA)//判断字符是否是数字{if(A='0'&&A='9')returntrue;elsereturnfalse;}boolREAERVE(char*a)//判断标识符是否为保留字{if(strcmp(a,if)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,int)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,for)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,while)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,do)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,return)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,break)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,continue)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,main)==0){cout(1,'a')endl;returntrue;}returnfalse;}-8-下面附上全部的代码:#includestring.h#includeiostream#includefstreamusingnamespacestd;boolLETTER(charA){if(A='a'&&A='z')returntrue;elseif(A='A'&&A='Z')returntrue;elsereturnfalse;}boolDIGIT(charA){if(A='0'&&A='9')returntrue;elsereturnfalse;}boolREAERVE(char*a){if(strcmp(a,if)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,int)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,for)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,while)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,do)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,return)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,break)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,continue)==0){cout(1,'a')endl;returntrue;}if(strcmp(a,main)==0){cout(1,'a')endl;returntrue;}returnfalse;}-9-boolzimu(charA){if((A='A'&&A='Z')||A='a'&&A='z')returntrue;returnfalse;}intmain(){chara;FILE*f;charCHAR;charTOKEN[120];f=fopen(code.txt,w);if(f==NULL){coutcon'tcreatefileendl;exit(0);}coutpleaseinputyoucodeendl;while((a=getchar())!='?')fputc(a,f);fclose(f);coutoverendl;f=fopen(code.txt,r);while((CHAR=fgetc(f))!=EOF){while(CHAR!=''){if(zimu(CHAR))//标括?识?符?{intk=0;do{TOKEN[k]=CHAR;k++;}while((CHAR=fgetc(f))!=EOF&&CHAR!=''&&zimu(CHAR));if(DIGIT(CHAR))//处鋦理え?是?否?为a包悒?含?数簓字?的?标括?识?符?{do{TOKEN[k]=CHAR;k++;}while((CHAR=fgetc(f))!=EOF&&CHAR!=''&&DIGIT(CHAR));}TOKEN[k]='\0';if(!(REAERVE(TOKEN)))//判D断?所ù得?标括?识?符?是?否?为a保馈?留?字?-10-cout(2,'TOKEN')endl;}if(DIGIT(CHAR))//整?数簓{inti=0;do{TOKEN[i]=CHAR;i++;}while((CHAR=fgetc(f))!=EOF&&CHAR!=''&&DIGIT(CHAR));TOKEN[i]='\0';if(!REAERVE(TOKEN))cout(3,'TOKEN')endl;}if(CHAR=='+'||CHAR=='-'||CHAR=='*'||CHAR=='/'||CHAR==''||CHAR==''||CHAR=='=')//运?算?符?{cout(4,'CHAR)endl;}if(CHAR==','||CHAR==';'||CHAR=='('||CHAR==')'||CHAR=='{'||CHAR=='}')//分?隔?符?{cout(5,'CHAR')endl;}break;}}fclose(f);cout按恪?任?意癮键ü退?出?endl;cinCHAR;return0;}测试结果:-11-文件存储在code.txt文件中-12-四、实验小结(包括问题和解决方法、心得体会、意见与建议等)这次实验让我们更加了解词法分析程序的原理,熟悉了书上词法分析程序构建的步骤,也强化了我们的编程能力,比如说文件读写操作。在我的程序中,思考了很久也没能实现”=””=”和”!=”的词法分析。拿”=”举例来说,CHAR读了””之后,进行判断如果是”=”就输出“(4,’=’)”。但是如果接下来的字符不是”=”,就需要判断这个CHAE字符是否为字母、数字、分隔符、其他运算符,这样就会和之前的判断进入一个死循环(因为在保留字判断的时候也要多读一个字符,判断为否定后要比较这个字符是否为数字,分隔符,运算符)。总的来说就是我不能将文件指针前移,导致这里写不出来,这是这次实验中的瑕疵。五、指导教师评语成绩批阅人日期
本文标题:编译原理词法分析器的构造
链接地址:https://www.777doc.com/doc-2069008 .html