编译原理--词法分析实验(含代码)

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

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

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

资源描述

计算机编译原理实验班级:计算机科学与技术113班姓名:学号:南昌大学信息工程学院计算机系实验1词法分析程序的设计一、实验目的掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求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)*运算符和界符+-*/===();{}关键字mainifthenelsewhiledoint(可根据需要添加)2、根据状态图,设计词法分析函数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,运行程序得到输出结果result.txt,并检查输出结果是否正确。六、测试数据输入数据:编辑一个文本文件program.txt,在文件中输入一段程序代码,如:将输出结果存放在result.txt文件中,输出格式如下:七、实验报告要求实验报告应包括以下几个部分:1、词法的正规式描述;2、变换后的状态图;3、词法分析程序的数据结构与算法。【源程序】#includeiostreamifdata+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,-;,-#includestringusingnamespacestd;#defineLENGTH5charch='';stringkey[5]={if,then,else,while,do};intIskey(stringc){//关键字判断inti;for(i=0;iLENGTH;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;}intIsNum(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)||IsNum(ch)){if((ch='Z')&&(ch='A'))ch=ch+32;arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);if(Iskey(arr)){coutarr,关键字endl;}elsecoutarr,普通标识符endl;}elseif(IsNum(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(IsNum(ch)||IsLetter1(ch)){arr=arr+ch;ch=fgetc(fpin);}}elseif(ch==''||ch==','||ch==';'){coutarr,整数0endl;}fseek(fpin,-1L,SEEK_CUR);if(flag==1)coutarr,八进制整数endl;elseif(flag==2)coutarr,十六进制整数endl;}else{arr=arr+ch;ch=fgetc(fpin);while(IsNum(ch)){arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);coutarr,十进制整数endl;}}elseswitch(ch){case'+':case'-':case'*':case'=':case'/':coutch,运算符endl;break;case'(':case')':case'[':case']':case';':case'.':case',':case'{':case'}':coutch,界符endl;break;case':':{ch=fgetc(fpin);if(ch=='=')cout:=,运算符endl;else{cout::,界符endl;;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=,运算符endl;if(ch=='')cout,输入控制符endl;else{cout,运算符endl;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=,运算符endl;elseif(ch=='')cout,输出控制符endl;elseif(ch=='')cout,运算符endl;else{cout,运算符endl;fseek(fpin,-1L,SEEK_CUR);}}break;default:coutch,无法识别字符endl;}}}voidmain(){charin_fn[30];FILE*fpin;cout请输入文件路径及文件名:;for(;;){cinin_fn;if((fpin=fopen(in_fn,r))!=NULL)break;elsecout文件路径错误!请输入文件路径及文件名:;}scan(fpin);system(pause);fclose(fpin);}3、实验总结与体会通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用C++直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。

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

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

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

×
保存成功