欢迎来到天天文库
浏览记录
ID:57382408
大小:73.34 KB
页数:13页
时间:2020-08-14
《词法分析报告.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理实验报告实验一词法分析程序的设计与实现指导教师:姓名:学号:班级:一、实验目的基本掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1.根据以下的正规式,编制正规文法,画出状态图;标识符<字母>(<字母>
2、<数字字符>)*十进制整数0
3、(1
4、2
5、3
6、4
7、5
8、6
9、7
10、8
11、9)(0
12、1
13、2
14、3
15、4
16、5
17、6
18、7
19、8
20、9)*八进制整数0(0
21、1
22、2
23、3
24、4
25、5
26、6
27、7)(0
28、1
29、2
30、3
31、4
32、5
33、6
34、7)*十六进制整数0(x
35、X)(0
36、
37、1
38、2
39、3
40、4
41、5
42、6
43、7
44、8
45、9
46、a
47、b
48、c
49、d
50、e
51、f)(0
52、1
53、2
54、3
55、4
56、5
57、6
58、7
59、8
60、9
61、a
62、b
63、c
64、d
65、e
66、f)*运算符和分隔符+-*/><=();关键字ifthenelsewhiledo2.根据状态图,设计词法分析函数intscan(),完成以下功能:(1)从输入流(键盘或文件)读入数据,分析出一个单词。(2)返回单词种别(用整数表示),(3)返回单词属性(不同的属性可以放在不同的全局变量中)。3.编写测试程序,循环调用函数scan(),每次调用,获得一个单词的信息。在测试程序中,打印输出单词种别、
67、属性(注意:不要在词法分析函数scan中打印输出!)。四、实验环境微型计算机。Windows操作系统/Linux操作系统。编程语言:C/C++/Java/C#。建议使用VisualC++/Netbeans/Eclipse集成开发环境。五、实验步骤1.根据状态图,设计词法分析算法2.设计函数scan(),实现该算法3.编制测试程序(在本试验中,可以是主函数main())。4.调试程序:输入一组单词,检查输出结果。六、状态图七.测试数据:092+data>0x3f00while八.测试结果九,思考题1.词法分析能否采用空
68、格来区分单词?答:不能,因为比如abc+bcd中没有空格,但这是三个单词。2.程序设计中哪些环节影响词法分析的效率?如何提高效率?答:整个程序都由状态转换图而来。由递归方法实现的状态转换图,影响了整个词法分析器的分析效率,可以考虑使用栈来非递归的实现词法分析。十.实验心得通过词法分析程序的实现,我理解了计算机是怎么去识别一个个单词的,或者可以说是各种命令的。这次实验使我对c语言中文件操作更加了解,了解文件指针的运行情况,还了解了编译原理中有限自动机的概念,根据状态图写程序。十一.源代码#include69、m>usingnamespacestd;#include#defineASG1#defineADD2#defineSUB3#defineMUL4#defineDIV5#defineID6#defineIF7#defineTHEN8#defineWHILE9#defineDO10#defineINT811//八进制#defineINT1012//十进制#defineINT1613#defineSLP14//左括号(#defineSRP15//右括号)#defineSEMI16//分号;#defineL70、P17//左花括号{#defineRP18//右花括号}#defineINC19//++#defineDECC20//--#defineNEQ21//不等于#defineEQ22//等于#defineJAE23//大于等于#defineJA24//大于#defineJBE25//小于等于#defineJB26//小于structword{intkind;intvalue;};intfpoint;//文件字符指针intnum_token;//一个单词中的字符数量,主要是数字长度char*token;fstreamfil71、e;//所要读取的文件wordhandle_identifier(char*ch)//处理标识符(包括关键字){structwordre;//返回值//////////////////////////关键字///////////////////////////if(strcmp(ch,"if")==0){re.kind=IF;re.value=0;returnre;}if(strcmp(ch,"then")==0){re.kind=THEN;re.value=0;returnre;}if(strcmp(ch,"whi72、le")==0){re.kind=WHILE;re.value=0;returnre;}if(strcmp(ch,"do")==0){re.kind=DO;re.value=0;returnre;}//////////////////////////标识符///////////////////////////re.kind=ID;re.valu
69、m>usingnamespacestd;#include#defineASG1#defineADD2#defineSUB3#defineMUL4#defineDIV5#defineID6#defineIF7#defineTHEN8#defineWHILE9#defineDO10#defineINT811//八进制#defineINT1012//十进制#defineINT1613#defineSLP14//左括号(#defineSRP15//右括号)#defineSEMI16//分号;#defineL
70、P17//左花括号{#defineRP18//右花括号}#defineINC19//++#defineDECC20//--#defineNEQ21//不等于#defineEQ22//等于#defineJAE23//大于等于#defineJA24//大于#defineJBE25//小于等于#defineJB26//小于structword{intkind;intvalue;};intfpoint;//文件字符指针intnum_token;//一个单词中的字符数量,主要是数字长度char*token;fstreamfil
71、e;//所要读取的文件wordhandle_identifier(char*ch)//处理标识符(包括关键字){structwordre;//返回值//////////////////////////关键字///////////////////////////if(strcmp(ch,"if")==0){re.kind=IF;re.value=0;returnre;}if(strcmp(ch,"then")==0){re.kind=THEN;re.value=0;returnre;}if(strcmp(ch,"whi
72、le")==0){re.kind=WHILE;re.value=0;returnre;}if(strcmp(ch,"do")==0){re.kind=DO;re.value=0;returnre;}//////////////////////////标识符///////////////////////////re.kind=ID;re.valu
此文档下载收益归作者所有