编译原理实验报告2-词法分析程序的设计_第1页
编译原理实验报告2-词法分析程序的设计_第2页
编译原理实验报告2-词法分析程序的设计_第3页
编译原理实验报告2-词法分析程序的设计_第4页
编译原理实验报告2-词法分析程序的设计_第5页
已阅读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

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、 根据正规式,画出状态转换图;if then 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置为空白字符。pro

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

6、while(isletter() | isdigit() concat(); getchar(); retract();"<%s , ->", strtoken);if(reserve() printf(else printf( "<,0,%s >", strtoken);else if( 1' < =ch && ch <= '9') while(isdigit() concat(); getchar(); retract();printf( "<,1,%s &g

7、t;", 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() | ch>= a, && c

8、h<= '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) 读取文件中的一个字符char ch;ch = fgetc(fp);return

9、 ch;char getbc(file* fp) /读取文件的字符直至ch不是空白char ch; do ch = getchar(fp); while (ch = ' ' | ch = 't' | ch = 'n'); return ch;void concat(charch ,charstrtoken口)/将ch 中的字符连接到 strtoken之后char str2;str0 = ch;str1 = '0' strcat(strtoken,str);int isletter(charch) /布尔函数,判断ch中的字符是否为

10、字母,是返回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 flag;int reservechar strtoken口)/整型函数,又tstrtoken中的字符串查找保留字表,若

11、它是一个保留字则返回它的编码,否则返回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中的字符串查找运算符和界符,若它是一个运算符或界符,则返回它的

12、编码,否则返回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,charch) 子函数,将搜索指示器回调一个字符位置,将ch置为空白字符ch =''fs

13、eekfp, -1l, 1);return ch;void proerror( ) /错误处理函数printf("输入错误! n");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)

14、concat(ch, strtoken) ch = getcharfp);ch = retract(fp,ch);if (reserve(strtoken) /判断关键字printf("<%s,->n", strtoken);elseprintf("<0,%s>n", strtoken);elseif (ch >= '1' && ch <= '9') 判断十进制整数while (isdigit(ch) concat(ch, strtoken); ch = getcharf

15、p);ch = retract(fp, ch);printf( "<1,%s>n", strtoken);elseif (ch = '0') ch = getchar(fp);if (ch >= '1' && ch <= '7') 判断八进制整数while (ch >= '0' && ch <= '7') concat(ch, strtoken); ch = getchar(fp);ch = retractfp, ch);pri

16、ntf( "<2,%s>n", strtoken);else if (ch = 'x') /判断十六进制整数ch = getcharfp);while (isdigit(ch) | ch >= 'a' && ch <= 'f') concat(ch, strtoken);ch = getchar(fp);ich = retractfp, ch);printf("<3,%s>n", strtoken);ielse /判断十进制的0ch = retractfp

17、, ch);printf("<1,0>n");=elseif (searchop(ch) /判断运算符和界符printf( "<%c,->n", ch);else /出错proerror(); return fp;4、编制测试程序(主函数main);#include<iostream>using namespacestd;#definenull 0nt main( ) file* fp;if (fp = fopen("c:usersadministratordesktopcode.txt" , &q

18、uot;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 < 0) thencode.txt -记事本文件遍瑁悟式萱若(if data+92>0z3f then data=data+01;elsedata=data-01;dodata = data + 01;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-sedafahdafa0

温馨提示

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

评论

0/150

提交评论