- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE 4
编译原理课程设计
设计题目:有限自动机的运行
年 级: 计062
姓 名: 黄思铭
学 号: 200600401062
日 期: 2010-5-18
指导教师: 陈望明
广西工学院计算机工程系
设计目的:
1、????????? 理解有限自动机的作用
2、????????? 利用转态图和状态表表示有限自动机
3、????????? 以程序实现有限自动机的运行过程
设计内容:(注:题目详细要求)
利用状态表和有限自动机的运行原理编制程序,使得程序能够识别一个输入串是否为一个有效的符号串,具体可以选择下面之一:无符号定点实数、自然数、整数、十六进制数或其它自己定义的符号串。
一、分析原理
词法分析:就是从左至右逐个字符地对源程序进行扫描,产生单词序列,用以语法分析。
在这里,我们先把文法转换成有穷自动机,然后构造出状态表,再由状态表构造出程序。
二、分析的算法
将G[无符号数]文法转换成有穷自动机:
构造状态矩阵;将有穷自动机的状S1 S2 ……Sn及输入的字a1 a2 ……am
输入
状态
d
.
e
ε
+/-
0
1
2
4
1
1
2
4
Z
2
3
3
3
4
Z
4
6
5
5
6
6
6
Z
Z
再写一个程序,把状态矩阵用二维数组表示。程序通过输入的字符转换状态,从而可以识别出单词。
本程序的关键在状态表和缓冲区的运用。首先定义了一个布尔型函数ReadALine把输入的字符串送到缓冲区中;然后定义了布尔型函数Run?和Getchar实现对输入字符串的正确性判断,更改Run函数可以改变程序功能:如可将状态表改变成识别“偶数”的有限自动机的状态表。
三、程序流程图
四、课程设计出现的问题及解决的方法
刚开始写该程序时,虽然感觉个人的编程能力不错,但由于对编译原理的自动机的实现掌握不足,难以入手。但经过对问题的更深入了解和分析,再通过网上和书本的资料的细读,最后终于把程序编写出来了。程序中,碰到的最大的问题就是状态表的构造和如何把它转变为一个程序的实现过程。解决的方法当然是看书。
五、课程设计的体会
首先,题目给出的文法是有小毛病的。我个人认为无符号数不可能推出 . 十进制数 或者 e 指数部分的。在写这个程序是只要对编译原理书本词法分析分析很熟悉就可以比较容易地写出该程序。通过这次课程设计,我对程序的编译和运行有了更进一步的了解,更好地掌握了编译原理的词法分析过程。
六、程序清单
#include stdlib.h //引入库函数
#include stdio.h //引入基本的库函数
#include string.h //引入字符串的库函数
//状态表相关存储信息:
#define STATE_NUMBER 7 //状态数目
#define CHAR_NUMBER 4 //输入字符的种类: . ; d ; e/E ; +/-
#define DOT 0 //输入数字在状态表中位于第0列
#define DIGIT 1 //小数点位于状态表的第1列
#define E 2 //E位于状态表的第2列
#define AD 3 //+/-运算符位于状态表的第3列
//State[][]为状态表,以整数组形式存放,0,1,2,3,4,5,6表示状态,-1表示没有此状态
int State
{
{1,2,3,-1},
{-1,4,-1,-1},
{1,2,3,-1},
{-1,5,-1,6},
{-1,4,3,-1},
{-1,5,-1,-1},
{-1,5,-1,-1}
};
int Q[STATE_NUMBER] = {0,0,1,0,1,1,0}; //终态标志:0非终态,1终态。
int index=0;//错误坐标
//缓冲区:
//输入缓冲区:由专门函数操作(ReadALine(),GetChar())
#define BUFFER_SIZE 1000 //表达式缓冲区大小
char Buffer[BUFFER_SIZE]; //表达式缓冲区,以\0表示结束
int ipBuffer = 0; //表达式缓冲区当前位置序号
char ch; //存放取得的一个字符
//函数声明:
int Run(); //对存储在缓冲区的一行字符串(以#结束)进行运行
void Init(); //全局初始化
int ReadALine(); //从键盘读一行(没有空格),存于表达式缓冲区Buffer[
您可能关注的文档
最近下载
- DB41T 2431-2023 重点区域地质灾害风险调查评价规范(1:10000).docx VIP
- 2012 INTERNATIONAL BUILDING CODE (2012年国际建筑规范).pdf VIP
- 金龙湖养老度假基地可行性报告.doc VIP
- 光伏发电工程施工规范.docx VIP
- 渗透检测工艺规程.pptx VIP
- 质量员考试(市政质量)基础知识试卷真题(2025年新版附解析).docx VIP
- 幼儿园课件:变焦PPT.ppt
- KEF音响无线HiFi扬声器LS50 Wireless II用户手册.pdf VIP
- 一种低气味、低刺激双固化胶粘剂及其制备方法.pdf VIP
- 设计机构设置和岗位职责.docx VIP
文档评论(0)