编译原理实验报告2-词法分析程序的设计_第1页
编译原理实验报告2-词法分析程序的设计_第2页
编译原理实验报告2-词法分析程序的设计_第3页
编译原理实验报告2-词法分析程序的设计_第4页
编译原理实验报告2-词法分析程序的设计_第5页
免费预览已结束,剩余5页可下载查看

下载本文档

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

文档简介

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 操作系统Turbo C 程

3、序集成环境或Visual C+ 程序集成环境五、实验步骤1、 根据正规式,画出状态转换图;一空白字母.字母或数字*1931758非 17 x4非0709 或 a09 或 af079非09与af10+或一芈*或/或或=或(或)或;11then else while do122、根据状态图,设计词法分析算法;观察状态图,其中状态 2、4、7、10 (右上角打了星号)需要回调一个字符。声明一些变量和函数:ch:字符变量,存放最新读进的源程序字符。strToken:字符串变量,存放构成单词符号的字符串。GetChar():子函数,将下一输入字符读到ch中,搜索指示器前移一字符位置。GetBC():子函

4、数,检查 ch中的字符是否为空白。若是,则调用 GetChar()直至ch 中进入一个非空白字符。Concat():子函数,将ch中的字符连接到 strToken之后。IsLetter():布尔函数,判断ch中的字符是否为字母。IsDigit():布尔函数,判断ch中的字符是否为数字。Reserve。:整型函数,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0。SearchOp():整型函数,对ch查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0。Retract():子函数,将搜索指示器回调一个字符位置,将ch置为空白字符。ProErro

5、r():错误处理函数。关键字保存在字符数组中,定义编码为相对数组首地址的位置+ 1。保留子表顺序如下: if ,then ,else ,while, do ,则相应编码为:1, 2, 3, 4, 5。运算符和界符保存在字符数组中,编码定义与关键字相同,顺序如下:+ 一* , / , , ,=,(,),;,编码为:110。二元表单词单词种类属性标识符0单词自身十进制整数1单词自身八进制整数2单词自身十六进制整数3单词自身运算符和界符单词自身-关键字单词自身-算法如下:ch= ; strToken=”GetBC();if(IsLetter() while(IsLetter() | IsDigit(

6、) Concat(); GetChar(); Retract();If(Reserve() printf(else printf( , strToken);,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=

7、x) GetChar();while(IsDigit() | ch=a, & ch= f) Concat(); 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 ) /读取文件的

8、字符直至ch不是空白char ch; do ch = GetChar( fp); | while (ch = | ch =t| ch =n);return ch;void Concat( char ch , char strToken 口) char str2;str0 =ch;str1 =0;strcat( strToken ,str);/将ch中的字符连接到strToken之后int IsLetter( char ch) 为字母,是返回1,否则返回0int flag = 0;if ( ch = a & ch = 0 & ch = 9) flag = 1;return flag;/布尔函数,

9、判断ch中的字符是否/布尔函数,判断ch中的字符是否为数int Reserve( char strToken 口)/整型函数,又tstrToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回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中的

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

11、); return ;FILE* scan( FILE* fp ) / 输出单个二元式char ch;char strToken10;strToken0 =0 ;/ 置strToken 为空串ch = GetBC( fp);/先读取一个非空白的字符if (feof( fp) return fp ;/判断文件尾,是则返回调用程序if (IsLetter(ch) / 判断标识符while (IsLetter(ch) | IsDigit(ch) Concat(ch, strToken); ch = GetChar( fp);ch = Retract( fp ,ch);if (Reserve(strT

12、oken) / 判断关键字printf( n , strToken); elseprintf( n , strToken);/判断十进制整数else if (ch = 1 & ch = 9 ) while (IsDigit(ch) Concat(ch, strToken);ch = GetChar( fp);ch = Retract( fp , ch);printf( n , strToken);else if (ch = 0 ) |ch = GetChar( fp);if (ch = 1 & ch = 0 & ch = Concat(ch, strToken);ch = GetChar( f

13、p);ch = Retract( fp , ch);printf( n , strToken);else if (ch = x ) ch = GetChar( fp);while (IsDigit(ch) | ch = Concat(ch, strToken);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) /

14、判断运算符和界符printf( n , ch);,_else / 出错ProError(); return fp;4、编制测试程序(主函数main);#include using namespacestd;#define NULL0int main( ) FILE* fp;if (fp = fopen( C:UsersAdministratorDesktopCode.txt, r ) = NULL/以只读方式打开文件,失败则退出程序printf( file can not open! );exit(0);printf(词法分析结果如下:n);while (!feof(fp) /若不是文件尾则执

15、行循环fp = scan(fp);/输出单词种类、属性的二元式fclose(fp);/ 关闭文件fp = NULL/避免指向非法内存5、调试程序:读入文本文件,检查输出结果。Ced占txt-纪事本文桂用第辑田将查骞(V)犁助7 Codelxt -记事本文件旧编崎(E)格式壹言 if data+920x3f then data=data+01;elsedata=da-ta-01;if (flag 0) thend 口data = data + 01,fl ag - flag + 0x89; while (dat a)|elsedata-dat a-01;八八八I 0 I式tv糜券s帧出葬姻I $ 人入 SEPWA0x3f then data=data+01;elsedata=data-01;正确结果: ,-七、实验报告要求实验报告应包括以下几个部分:1、词法的正规式描述;2、变换后的状态图;3、词法分析程序的数据结构与算法。八、思考题1、 词法分析能否采用空格来区分单词?答:不能,因为程序的语法里有包括:;, , , ( , ) 等界符或连接符号存在,这些符号符与单词的连接无空格,用空格区分单词将无法保证程序语法的正确。2、 程序设计中哪些环节影响词法分析的效率?如何提高效率?答 : 本程序

温馨提示

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

评论

0/150

提交评论