您好,欢迎访问三七文档
南昌大学实验报告学生姓名:沙新媛学号:6103113108专业班级:计科133实验类型:■验证□综合□设计□创新实验日期:实验成绩:实验2词法分析程序的设计一、实验目的掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1、根据以下的正规式,编制正规文法,画出状态图;标识符字母(字母|数字字符)*十进制整数0|((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和界符+-*/=();关键字ifthenelsewhiledo2、根据状态图,设计词法分析函数intscan(),完成以下功能:1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2)以二元式形式输出单词单词种类,单词属性其中单词种类用整数表示:0:标识符1:十进制整数2:八进制整数3:十六进制整数运算符和界符,关键字采用一字一符,不编码其中单词属性表示如下:标识符,整数由于采用一类一符,属性用单词表示运算符和界符,关键字采用一字一符,属性为空3、编写测试程序,反复调用函数scan(),输出单词种别和属性。四、实验环境PC微机DOS操作系统或Windows操作系统TurboC程序集成环境或VisualC++程序集成环境五、实验步骤1、根据正规式,画出状态转换图;2、根据状态图,设计词法分析算法;3、采用C或C++语言,设计函数scan(),实现该算法;4、编制测试程序(主函数main);5、调试程序:读入文本文件,检查输出结果。六、测试数据输入数据:编辑一个文本文件program.txt,在文件中输入如下内容:正确结果:七、实验报告要求实验报告应包括以下几个部分:ifdata+920x3fthendata=data+01;elsedata=data-01;if,-0,data+,-1,92,-3,3fthen,-0,data=,0,data+,-2,1;,-else,-0,data=,-0,data-,-2,-;,-1、词法的正规式描述;2、变换后的状态图;3、词法分析程序的数据结构与算法。}#includeiostream#includestringusingnamespacestd;#defineMAX5charch='';stringkey[5]={if,then,else,while,do};intIskey(stringc){//关键字判断inti;for(i=0;iMAX;i++){if(key[i].compare(c)==0)return1;}return0;}intIsLetter(charc){//判断是否为字母if(((c='z')&&(c='a'))||((c='Z')&&(c='A')))return1;elsereturn0;}intIsLetter1(charc){//判断是否为a~f字母if(((c='f')&&(c='a'))||((c='F')&&(c='A')))return1;elsereturn0;}intIsDigit(charc){//判断是否为数字if(c='0'&&c='9')return1;elsereturn0;}voidscan(FILE*fpin){stringarr=;while((ch=fgetc(fpin))!=EOF){arr=;if(ch==''||ch=='\t'||ch=='\n'){}elseif(IsLetter(ch)||ch=='_'){arr=arr+ch;ch=fgetc(fpin);while(IsLetter(ch)||IsDigit(ch)){if((ch='Z')&&(ch='A'))ch=ch+32;arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);if(Iskey(arr)){coutarr\t\t||关键字endl;}elsecoutarr\t\t||普通标识符endl;}elseif(IsDigit(ch)){intflag=0;if(ch=='0'){arr=arr+ch;ch=fgetc(fpin);if(ch='0'&&ch='7'){while(ch='0'&&ch='7'){flag=1;arr=arr+ch;ch=fgetc(fpin);}}elseif(ch=='x'||ch=='X'){flag=2;arr=arr+ch;ch=fgetc(fpin);while(IsDigit(ch)||IsLetter1(ch)){arr=arr+ch;ch=fgetc(fpin);}}elseif(ch==''||ch==','||ch==';'){coutarr\t\t||整数0endl;}fseek(fpin,-1L,SEEK_CUR);if(flag==1)coutarr\t\t||八进制整数endl;elseif(flag==2)coutarr\t\t||十六进制整数endl;}else{arr=arr+ch;ch=fgetc(fpin);while(IsDigit(ch)){arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);coutarr\t\t||十进制整数endl;}}elseswitch(ch){case'+':case'-':case'*':case'=':case'/':coutch\t\t||运算符endl;break;case'(':case')':case'[':case']':case';':case'.':case',':case'{':case'}':coutch\t\t||界符endl;break;case':':{ch=fgetc(fpin);if(ch=='=')cout:=\t\t||运算符endl;else{cout::\t\t||界符endl;;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=\t\t||运算符endl;if(ch=='')cout\t\t||输入控制符endl;else{cout\t\t||运算符endl;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=\t\t||运算符endl;elseif(ch=='')cout\t\t||输出控制符endl;elseif(ch=='')cout\t\t||运算符endl;else{cout\t\t||运算符endl;fseek(fpin,-1L,SEEK_CUR);}}break;default:coutch\t\t||无法识别字符endl;}}}voidmain(){charin_fn[30];FILE*fpin;cout请输入源文件名(包括路径和后缀名):;for(;;){cinin_fn;if((fpin=fopen(in_fn,r))!=NULL)break;elsecout文件路径错误!请输入源文件名(包括路径和后缀名):;}cout\n\n************开始运行***************endl;scan(fpin);system(pause);fclose(fpin);}八、实验心得:这个实验大致分为两部分:一是读取.txt文件内容;二是进行识别。其中,文件读取就考虑路径对和不对。至于识别,首先对关键字if,then,else,while,do进行识别判断,然后运算符界符普通标识符等都分别进行判断,最后输出即可。缺点就是效率不高。九、思考题1、词法分析能否采用空格来区分单词?不能。空格不是唯一可以用来分割区分单词的标志,还可以是+,-,*,/,,,(,……等运算符或界定符。如果用空格来区分单词的话,就会使连接符和标识符无法区分。2、程序设计中哪些环节影响词法分析的效率?如何提高效率?在判断关键字时,操作是把单词全部读取并存放在一个字符数组后再逐个与关键字表匹配,这样做可能效率比较低,若能在读取的同时判断可能会提高效率。可以考虑使用栈来非递归的实现词法分析。
本文标题:词法分析程序的设计
链接地址:https://www.777doc.com/doc-5842302 .html