编译原理实验报告2-词法分析程序的设计

上传人:灯火****19 文档编号:26174991 上传时间:2021-08-06 格式:DOCX 页数:10 大小:126.49KB
收藏 版权申诉 举报 下载
编译原理实验报告2-词法分析程序的设计_第1页
第1页 / 共10页
编译原理实验报告2-词法分析程序的设计_第2页
第2页 / 共10页
编译原理实验报告2-词法分析程序的设计_第3页
第3页 / 共10页
资源描述:

《编译原理实验报告2-词法分析程序的设计》由会员分享,可在线阅读,更多相关《编译原理实验报告2-词法分析程序的设计(10页珍藏版)》请在装配图网上搜索。

1、实验 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 *运算符和

2、界符+ - * / = ( ) ;关键字if then else while do2、根据状态图,设计词法分析函数int scan( ) ,完成以下功能:1) 从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2) 以二元式形式输出单词其中单词种类用整数表示:0:标识符1:十进制整数2:八进制整数3:十六进制整数运算符和界符,关键字采用一字一符,不编码其中单词属性表示如下:标识符,整数由于采用一类一符,属性用单词表示运算符和界符,关键字采用一字一符,属性为空3、编写测试程序,反复调用函数scan( ) ,输出单词种别和属性。四、实验环境PC 微机DOS 操作系统或Windows 操作

3、系统Turbo C 程序集成环境或Visual C+ 程序集成环境五、实验步骤1、 根据正规式,画出状态转换图;if then else while do122、根据状态图,设计词法分析算法;观察状态图,其中状态 2、4、7、10 (右上角打了星号)需要回调一个字符。声明一些变量和函数:ch:字符变量,存放最新读进的源程序字符。strToken:字符串变量,存放构成单词符号的字符串。GetChar():子函数,将下一输入字符读到ch中,搜索指示器前移一字符位置。GetBC():子函数,检查 ch中的字符是否为空白。若是,则调用 GetChar()直至ch 中进入一个非空白字符。Concat()

4、:子函数,将ch中的字符连接到 strToken之后。IsLetter():布尔函数,判断ch中的字符是否为字母。IsDigit():布尔函数,判断ch中的字符是否为数字。Reserve。:整型函数,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0。SearchOp():整型函数,对ch查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0。Retract():子函数,将搜索指示器回调一个字符位置,将ch置为空白字符。ProError():错误处理函数。关键字保存在字符数组中,定义编码为相对数组首地址的位置+ 1。保留子表顺序如下: if ,t

5、hen ,else ,while, do ,则相应编码为:1, 2, 3, 4, 5。运算符和界符保存在字符数组中,编码定义与关键字相同,顺序如下: + ,- , *,/ , , ,二,(,),;,编码为:110。二元表单词单词种类属性标识符0单词自身十进制整数1单词自身八进制整数2单词自身十六进制整数3单词自身运算符和界符单词自身-关键字单词自身-算法如下:ch= ; strToken=”GetBC();if(IsLetter() while(IsLetter() | IsDigit() Concat(); GetChar(); Retract();, strToken);If(Reserv

6、e() printf(else printf( , strToken);else if( 1 =ch & ch = 9) while(IsDigit() Concat(); GetChar(); Retract();printf( , strToken);else if(ch= 0) GetChar();if(ch = 1 & ch = 0 & ch = 7) Concat(); GetChar(); Retract();printf( , strToken);else if(ch= x) GetChar();while(IsDigit() | ch= a, & ch= f) Concat()

7、; GetChar(); Retract();printf( , strToken);else Retract(); printf( );else if(SearchOp() printf( , ch);else ProError();3、采用C或C+语言,设计函数scan(),实现该算法;char GetChar(FILE * fp) 读取文件中的一个字符char ch;ch = fgetc(fp);return ch;char GetBC(FILE* fp) /读取文件的字符直至ch不是空白char ch; do ch = GetChar(fp); while (ch = | ch = t

8、 | ch = n); return ch;void Concat(charch ,charstrToken口)/将ch 中的字符连接到 strToken之后char str2;str0 = ch;str1 = 0; strcat(strToken,str);int IsLetter(charch) /布尔函数,判断ch中的字符是否为字母,是返回1,否则返回0int flag = 0;if (ch = a & ch = 0 & ch = 9) flag = 1;return flag;int ReserveChar strToken口)/整型函数,又tstrToken中的字符串查找保留字表,若

9、它是一个保留字则返回它的编码,否则返回0int code = 0,i;char keyWord66 = if , then, else, while, do ; for (i = 0; i 5; i+) if (strcmp(strToken, keyWordi) = 0) code = i + 1;break;return code;int SearchOPcharch) /整型函数,对strToken中的字符串查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0int code = 0, i;char OP11 = +,-,*,/,=,(,);for (i = 0; i 1

10、0; i+) if (ch = OPi) code = i + 1; break;return code;char Retract(FILE* fp,charch) 子函数,将搜索指示器回调一个字符位置,将ch置为空白字符ch =;fseekfp, -1L, 1);return ch;void ProError( ) /错误处理函数printf(输入错误! n);return;FILE* scan(FILE* fp) 输出单个二元式char ch;char strToken10;strToken0 = 0;置 strToken 为空串ch = GetBC(fp);/先读取一个非空白的字符if

11、(feof(fp) return fp;/判断文件尾,是则返回调用程序/判断标识符if (IsLetter(ch) while (IsLetter(ch) | IsDigit(ch) Concat(ch, strToken) ch = GetCharfp);ch = Retract(fp,ch);if (Reserve(strToken) /判断关键字printf(n, strToken);elseprintf(n, strToken);elseif (ch = 1 & ch = 9) 判断十进制整数while (IsDigit(ch) Concat(ch, strToken); ch = G

12、etCharfp);ch = Retract(fp, ch);printf( n, strToken);elseif (ch = 0) ch = GetChar(fp);if (ch = 1 & ch = 0 & ch = 7) Concat(ch, strToken); ch = GetChar(fp);ch = Retractfp, ch);printf( n, strToken);else if (ch = x) /判断十六进制整数ch = GetCharfp);while (IsDigit(ch) | ch = a & ch = f) Concat(ch, strToken);ch =

13、 GetChar(fp);Ich = Retractfp, ch);printf(n, strToken);Ielse /判断十进制的0ch = Retractfp, ch);printf(n);=elseif (SearchOP(ch) /判断运算符和界符printf( n, ch);else /出错ProError(); return fp;4、编制测试程序(主函数main);#includeusing namespacestd;#defineNULL 0nt main( ) FILE* fp;if (fp = fopen(C:UsersAdministratorDesktopCode.t

14、xt , r) = NULL ) /以只读方式打开文件,失败则退出程序printf( file can not open!);exit(0);printf(词法分析结果如下:n);while (!feof(fp) /若不是文件尾则执行循环fp = scan(fp);输出单词种类、属性的二元式fclose(fp);关闭文件fp = NULL ;/避免指向非法内存5、调试程序:读入文本文件,检查输出结果。Jde.brt -记事本W件旧的格式(0查看(V)帮助S)_ if(flag 0z3f then data=data+01;elsedata=data-01;dodata = data + 01;

15、flag = flag + 0x89; while(data) |elsedat a= datS3 C:VZ i n d owssyste m 3 2cmd. exe丽 C:Window5syitem32cnnid.exe,谶 港去:-MMM3prograntxrmM3w谶nT取: if dafa+92vox3f fhendafaHdafa+01;e-sedafaHdafa01;f . IVAo . dafav+ 7 .V1 7 92VAv 7 .V3.3fv Afherl. iv Ao . dafav ah - VAo . dafav+ 7 .V2 ) IV;.VAe-se . iv Ao

16、. dafavH IVAo . dafav Ai - IV 2% A; . .V七、实验报告要求实验报告应包括以下几个部分:1、词法的正规式描述;2、变换后的状态图;3、词法分析程序的数据结构与算法。八、思考题1 、 词法分析能否采用空格来区分单词?答:不能,因为程序的语法里有包括:;, , , (, ) 等界符或 连接符号存在,这些符号符与单词的连接无空格,用空格区分单词将无法保证程序语法的正确。2 、 程序设计中哪些环节影响词法分析的效率?如何提高效率?答 : 本程序在判断关键字时,是在完成对标志符的识别后,判断该标识符是否是保留字,若是则判断为关键字,这种情况下,导致每次识别完一个标识符,都要查询保留字表,会影响效率,可在识别标识符的程序段中添加对关键字的识别,如首字母的特别判断或遇到数字跳过关键字的判断等。另外,程序的实现是通过在主函数中循环调用 scan ()函数来输出二元式,一次调用就输出一个二元式,可以考虑使用堆栈,先将读来的数据压栈,再进行识别,这样比重复调用函数效率更高,而且也不必使用文件指针来回调字节,用堆栈会更方便更安全准确,省去不少程序段。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!