编译原理试验报告词法分析程序的设计_第1页
编译原理试验报告词法分析程序的设计_第2页
编译原理试验报告词法分析程序的设计_第3页
编译原理试验报告词法分析程序的设计_第4页
编译原理试验报告词法分析程序的设计_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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、 根据正规式,画出状态转换图;2、根据状态图,设计词法分析算法;观察状态图,其中状态2、4、7、10 (右上角打了星号)需要回调一个字符。声明一些变量和函数:ch:字符变量,存放最新读进的源程序字符。 strToken:字符串变量,存放构成单词符号的字符串。GetChar():子函数,将下一输入字符读到ch中,搜索指示器前移一字符位置。GetBC():子函数,检查 ch中的字符是否为空白。若是,则调用GetChar()直至ch中进入一个非空白字符。Concat():子函数,将ch中的字符连接到 strTok

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

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

6、(v,o,%s , strToken );else if( 1 =ch & ch = 9)while(lsDigit()Con cat();GetChar(); Retract();printf( , strToken );else if(ch= O)GetChar();if(ch =1 & ch = 0 & ch = 7) Con cat(); GetChar(); Retract();printf( , strToken );else if(ch= x)GetChar();while(IsDigit() | ch= a& ch=) Con cat(); GetChar(); Retract

7、();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| ch =n);return

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

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 SearchOP( char ch) /整型函数,对strToken中的字符串查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0int code = 0, i;char OP11 = +,- , * , / , = , ( , ) ,

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

11、;/置strToken为空串/先读取一个非空白的字符if (feof( fp)return fp;/判断文件尾,是则返回调用程序if (IsLetter(ch) / 判断标识符while (IsLetter(ch) | IsDigit(ch) Con cat(ch, strToke n);ch = GetChar( fp);ch = Retract( fp ,ch);if (Reserve(strToken) / 判断关键字printf( n , strToken);elseprintf( n , strToken);else if (ch =1 & ch = 9while (IsDigit(

12、ch) Con cat(ch, strToke n); ch = GetChar( fp);ch = Retract( fp , ch);printf( n , strToken);else if (ch =O ) ch = GetChar( fp);if (ch =1& ch =0 & ch =Con cat(ch, strToke n); ch = GetChar( fp);ch = Retract( fp , ch); printf( n , strToken);else if (ch =x ) ch = GetChar( fp);while (IsDigit(ch) | ch = Co

13、n cat(ch, strToke n); ch = GetChar( fp);/判断十进制整数/判断八进制整数7 ) /判断十六进制整数a & ch = f ) ch = Retract( fp , ch);printf(n , strToken);else /判断十进制的0ch = Retract( fp , ch);printf(n);else if (SearchOP(ch) /判断运算符和界符printf( n , ch);|else /出错ProError();return fp;4、编制测试程序(主函数main);#include using namespacestd;#defi

14、 ne NULLOnt main( ) FILE* fp;if (fp = fopen(C:UsersAdministratorWDesktopWCode.txt/以只读方式打开文件,失败则退岀程序prin tf( file can not ope n!);exit(0);r ) = NULLwhile (!feof(fp) /若不是文件尾则执行循环fp = sca n(fp);/输出单词种类、属性的二元式printf(词法分析结果如下:n);fclose(fp);/关闭文件fp = NULL5、调试程序:读入文本文件,检查输出结果。/避免指向非法内存:Codelxt -记事本文件(F)扁辐(

15、E)植式3 章看 if data+920x3f then data=data+01;elsedata=da-ta-01;戈件(F)舉辑(日恪式(0)査蚕(V)報助(出 if (flag 0) thendo曲ta = data + 01, fl ag - flag + 0x89;while (dat a)|else-MMM辛 program.txrmM辛甘鸯 n-H_ if da5r+92vox3f fhen dafaudafa+ol 八e-sedafaudafaol 八f 一 IVAo . daQrvA+.VA- 一 92V Av.VA3 一 3fv hen . iv Ao . daQrv ahVAo . daQrvA+.VA2 一 IVA.VAe-seiv Ao . daQrv ah.VAo . daQrv A-.VA2v A一 .V七、实验报告要求实验报告应包括以下几个部分:1、词法的正规式描述;2、变换后的 状态图;3、词法分析程序的数据结构与算法。八、思考题1、 词法分析能否采用空格来区分单词? 答:不能,因为程序的语法里有包括:;, , ,(,)等界符或 连接符号存在,这些符号符与单词的连接无空格,用空格区分单词将无法保证程序 语法的正确。2、 程序设计中哪些环节影响词法分析的效率?如何提高效率? 答: 本程序在判断关键

温馨提示

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

评论

0/150

提交评论