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

上传人:scccc 文档编号:14602210 上传时间:2022-02-09 格式:DOC 页数:10 大小:145.50KB
返回 下载 相关 举报
编译原理实验报告2词法分析程序的设计.doc_第1页
第1页 / 共10页
编译原理实验报告2词法分析程序的设计.doc_第2页
第2页 / 共10页
编译原理实验报告2词法分析程序的设计.doc_第3页
第3页 / 共10页
亲,该文档总共10页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、实验2词法分析程序的设计一、实验目的掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1、根据以下的正规式,编制正规文法,画出状态图:标识符 十进制整数 八进制整数 十六进制整数 运算符和界符 关键字V字母(V字母|数字字符)*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) *Ox (0|l|2|3|4|5|6|7|8|9|a|b|c|d|e|f) (0|l|2|3|4|5|6|7|8|9|

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

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

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

5、, 5。运算符和界符保存在字符数组中,编码定义与关键字相同,顺序如下: +, = ,(,),;,编码为:二元表单词单词种类属性标识符0单词自身十进制整数1单词自身八进制整数2单词自身十六进制整数3单词自身运算符和界符单词自身-关键字单词自身-算法如下:ch= ” ; strToken=n 笃GetBCQ;if(IsLetter() while(IsLetterQ | IsDigitQ) ConcatQ; GetCharQ; RetiactQ;If(Reseive() printf C*%s , -,strToken); else0, %s,strToken);else ifr =ch & ch

6、 ) GetChai();if(ch =CT & ch= & ch = X & ch=f) ConcatQ; GetChar(); Retract();3, %s,strToken);else RetractQ;prmtf(c “);else if(SearchOp() printf= 1 a* & ch = 1 O & ch = 9) flag = 1;return flag;将ch中的字符连接到stricken之后布尔函数,判断ch中的字符是否布尔函数,判断ch中的字符是否为数int Reserve (char strTokenEJ) /整型函数,对strToken中的字符串查找保留字表,

7、若它是一个保留字则返回它的编码,否则返回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 0Pll = 一,X,for (i = 0; i n, strTo

8、ken);elseprintf (0, %snzz, strToken);else if (ch = * T & ch = 9*) wh订e (IsDigit(ch) 子函数,将搜索指示器回调一个字符位置,/错误处理函数输出单个二元式/置strToken为空串/先读取一个非空白的字符/判断文件尾,是则返回调用程序/判断标识符判断关键字判断十进制整数Concat(ch, strToken);ch = GetChar(fp):ch = Retract(fp, ch);printf (Mn/z, strToken);else if (ch = 0)ch = GetChar(fp);if (ch =

9、1 & ch V 7) /判断八进制整数while (ch= 0 & ch = * 7*) Concat(ch, strToken);ch = GetChar(fp);ch = Retract(fp, ch);printf (z/n/z, strToken);else if (ch = x) 判断十六进制整数ch = GetChar(fp):while (IsDigit (ch) | ch 二(ch = f) Concat(ch, strToken);ch = GetChar(fp);ch = Retract(fp, ch);printf (nzz, strToken);else /判断十进制

10、的0ch = Retract(fp, ch); printf (nzz);else if (SearchOP (ch) /判断运算符和界符printf (Mn/, ch);else 出错ProError 0;return fp;4、编制测试程序(主函数main);#includeusing namespace std;丰define NULL 0int main( ) FILE* fp;if (fp = fopen(zzC:UsersAdministratorDesktopCode. txtz,, r) = NULL)以只读方式打开文件,失败则退出程序printf(z,file can not

11、 open!);exit(O);printf(词法分析结果如下: while (!feof(fp) fp = scan(fp); fclose(fp); fp = NULL;5、调试程序:读入文本文件,六、测试数据n);若不是文件尾则执行循环输出单词种类、属性的二元式/关闭文件避免指向非法内存检查输出结果。输入数据:正七、实实if data+920x3f thendata=data+Ol;else data=data-Ol;确结果:验报告要验报告应包括几个部分:1、词法的正规式描述:2、变换后的状态图;3、词法分析程序的数据结构与算法。八、思考题1、词法分析能否采用空格来区分单词?答:不能,因

12、为程序的语法里有包括:;等界符或连接符号存在,这些符号符 词的连接无空格,用空格区分单词将无法保证程序语 正确。2、程序设计中哪些环节影响词法分析的效率?如何提 高效率?答:本程序在判断关键字时,是在完成对标志符的识 判断该标识符是否是保留字,若是则判断为关键字, o,- 今,3f 2厂与单法的别后, 这种编辑一个文本文件piogram.txt,在文件中输入如下内容:情况下,导致每次识别完一个标识符,都要查询保留字表,会影响效率,可在识别 标识符的程序段中添加对关键字的识别,如首字母的特别判断或遇到数字跳过关键 字的判断等。另外,程序的实现是通过在主函数中循坏调用scan ()函数来输出二 元式,一次调用就输出一个二元式,可以考虑使用堆栈,先将读来的数据压栈,再 进行识别,这样比重复调用函数效率更高,而且也不必使用文件指针来回调字节, 用堆栈会更方便更安全准确,省去不少程序段。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1