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

下载本文档

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

文档简介

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|

2、3|4|5|6|7|8|9|a|b|c|d|e|f )运算符和界符+ - * / > < = ( ) ;关键字if then else while do2、根据状态图,设计词法分析函数 int scan( ) ,完成以下功能:1) 从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2) 以二元式形式输出单词 < 单词种类,单词属性 > 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字

3、一符,属性为空3、编写测试程序,反复调用函数 scan( ),输出单词种别和属性。四、实验环境PC 微机DOS 操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤1、根据正规式,画出状态转换图;2、观察状态图,其中状态 2、4、7、 10(右上角打了星号)需要回调一个字符。 声明一些变量和函数:ch: 字符变量,存放最新读进的源程序字符。strToken: 字符串变量,存放构成单词符号的字符串。GetChar(): 子函数,将下一输入字符读到 ch 中,搜索指示器前移一字符位置。GetBC(): 子函数,检查 ch 中的字符是否为空

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

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

6、);if(IsLetter() while(IsLetter() | IsDigit() Concat(); GetChar(); Retract();If(Reserve() printf( "<%s , ->", strToken); else printf( "<,0,%s >", strToken);else if( 1' < =ch && ch <= '9') while(IsDigit() Concat(); GetChar(); Retract();printf(

7、"<,1,%s >", strToken) ;else if(ch= '0') GetChar();if(ch >= 1' && ch <= 7') while(ch >= 0' && ch <= 7') Concat(); GetChar(); Retract();printf( "<,2,%s >", strToken) ;else if(ch= 'x') GetChar();while(IsDigit()

8、| ch>= a' && ch<= 'f') Concat(); GetChar(); Retract();printf( "<,3,%s >", strToken); else Retract();printf( “<1,0> “) ;else if(SearchOp() printf( "<%c,- >", ch);else ProError();3、采用 C或 C+语言,设计函数 scan( ),实现该算法; char GetChar(FILE* fp) / 读

9、取文件中的一个字符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 ch;void Concat( char ch ,char strToken) / 将ch中的字符连接到 strToken 之后char str2; str0 = ch str1 = '0'strcat(strTok

10、en,str);int IsLetter(char ch) / 布尔函数,判断 ch 中的字符是否为字母 ,是返回 1,否则返回 0int flag = 0;if (ch >= 'a' && ch <= 'z')flag = 1;return flag;int IsDigit( char ch) / 布尔函数,判断 ch中的字符是否为数字 ,是返回 1,否则返回 0int flag = 0;if (ch >= '0'&& ch <= '9')flag = 1;return f

11、lag;int Reserve(char strToken ) /整型函数,对 strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回 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

12、 SearchOP(char ch) / 整型函数,对 strToken 中的字符串查找运算符和界符,若它是个运算符或界符,则返回它的编码,否则返回 0int code = 0, i;char OP11 = '+', '-' ,'*', '/', '<', '>', '=', '(', ')', '' ;for (i = 0; i < 10; i+) if (ch = OPi) code = i + 1;break;r

13、eturn code;char Retract(FILE* fp ,char ch) / 子函数,将搜索指示器回调一个字符位置,将 ch置为空白字符ch = ' 'fseek(fp, -1L, 1);return ch;void ProError( ) / 错误处理函数printf( "输入错误! n"); return ;char strToken10;strToken0 = '0'/ 置 strToken为空串ch = GetBC(fp);/ 先读取一个非空白的字符if (feof( fp)return fp;/ 判断文件尾,是则返回调用

14、程序FILE* scan(FILE* fp) / 输出单个二元式char ch;if (IsLetter(ch) / 判断标识符while (IsLetter(ch) | IsDigit(ch) Concat(ch, strToken);ch = GetChar( fp );ch = Retract( fp,ch);elseprintf( "<0,%s>n" , strToken);else if (ch >= '1' && ch <= '9') /判断十进制整数while (IsDigit(ch) C

15、oncat(ch, strToken);ch = GetChar( fp );ch = Retract( fp, ch); printf( "<1,%s>n" , strToken);else if (ch = '0') ch = GetChar( fp);if (ch >= '1' && ch <= '7') / 判断八进制整数 while (ch >= '0' && ch <= '7') Concat(ch, strToke

16、n); ch = GetChar( fp);ch = Retract( fp , ch);printf( "<2,%s>n" , strToken);else if (ch = 'x') /判断十六进制整数ch = GetChar( fp );while (IsDigit(ch) | ch >= 'a' && ch <= 'f') Concat(ch, strToken);ch = GetChar( fp);ch = Retract( fp , ch); printf( "&l

17、t;3,%s>n" , strToken);else / 判断十进制的 0 ch = Retract( fp , ch); printf( "<1,0>n" );else if (SearchOP(ch) /判断运算符和界符printf( "<%c,->n" , ch);else / 出错ProError(); return fp;4、编制测试程序(主函数 main ); #include <iostream> using namespace std;#define NULL 0 int main( )

18、 FILE* fp;/ 以if (fp = fopen( "C:UsersAdministratorDesktopCode.txt" , "r") = NULL) 只读方式打开文件,失败则退出程序printf( "file can not open!" );exit(0);printf( " 词法分析结果如下: n");while (!feof(fp) / 若不是文件尾则执行循环fp = scan(fp);/ 输出单词种类、属性的二元式fclose(fp);/ 关闭文件fp = NULL;/ 避免指向非法内存5、调试程序:读入文本文件,检查输出结果。六、测试数据输入数据:编辑一个文本文件 program.txt ,在文件中输入如下内容: if data+92>0x3f thendata=data+01;elsedata=data-01;正确结果:<if , -><0 , data><+ , -><1 , 92> <> , -><3 , 3f> <then , -> <0 , data> <= , &g

温馨提示

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

评论

0/150

提交评论