编译技术课程设计自动机的状态转换图表示本科论文.docx
《编译技术课程设计自动机的状态转换图表示本科论文.docx》由会员分享,可在线阅读,更多相关《编译技术课程设计自动机的状态转换图表示本科论文.docx(21页珍藏版)》请在冰豆网上搜索。
编译技术课程设计自动机的状态转换图表示本科论文
课程设计报告
(2011--2012年度第一学期)
名称:
编译技术课程设计
题目:
自动机的状态转换图表示
院系:
控制与计算机工程学院
班级:
信安1001
学号:
学生姓名:
指导教师:
设计周数:
一周
成绩:
日期:
2013年1月12日
1课程设计的目的和要求
1.1课程设计的目的
本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。
设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术。
1.2课程设计的要求
1.要求设计一个具有绘图功能的程序,可以手工以状态转换图的方式绘制自动机;
2.图形化的自动机可以保存,读取;
3.根据状态转换图得出自动机的状态转换矩阵;
4.根据状态转换矩阵,自动绘制出状态转换图。
2系统描述
本次课程设计是在win7的环境下,使用visualC++6.0软件制作的一个多功能绘图软件。
主要功能为描述一个确定的有限状态自动机,具体功能为绘制自动机,自动机转化为转移矩阵,转移矩阵自动转化为自动机。
本课设中用圆圈表示状态,用大写字母表示,用弧线表示状态之间的转移关系,输入符号用小写字母表示,初态前面加箭头,终态集用双圆圈表示。
本次课程设计只针对简单的自动机,状态表示仅限于26个大写字符,输入符号仅限于26个小写字符,存在一定的局限性。
本软件支持图形文件的读取和保存,同时,可以读取描述状态机的TXT文件(固定格式),自动绘制状态机
2.1确定的自动机的描述
一个确定的又穷自动机M是一个五元组:
M=(K,∑,f,S,Z),其中:
1,K是一个有穷状态集,这里我们用单个大写字母表示
2,∑是一个有穷输入符号集,这里我们用单个小写字母表示
3,f是状态间的转换函数,形如:
f(K,a)=D,表示K状态输入字符a之后自动转换到D状态
4,S是唯一的初态
5,Z是终态集
2.2状态转移矩阵的描述
一个确定的有限状态自动机还可以用一个矩阵表示,该矩阵的行表示状态,列表示输入符号,矩阵元素表示相应状态和输入符号后将要转换成的新状态,用“—>”表示初态,终态行在表尾部标以“1”,非终态标以“0”。
3概要设计
3.1概要设计
打开软件界面,点击进行绘图操作,先选中图形,在界面上点击,出现一个图元。
选中图元,右击出现快捷菜单,选择更改图元属性或者删除图元,重复操作,直到把整个自动机绘制完成。
所有的图元都存放在CDocument类的两个链表中,这两条链分别为m_StatusList和m_RelationList,分别存放状态和关系图元。
在OnDraw()函数中调用该链表进行绘图,保证图元可重复刷新和不丢失。
对关系图元,我们用两个变量分别标记它的开始图元和终止图元,以表示状态和关系之间的联系,在装换成状态装换矩阵时,我们用这种联系找到状态和输入符号之间的转换关系,做出状态转换矩阵
对于关系图元的位置,我们是根据其起始图元和终止图元的位置唯一确定的,这样,只要把状态图元的位置摆好了,关系弧也就不难画出来,根据这个巧妙的结构,在由转移矩阵绘制状态图时,我先设置状态的位置,然后关系弧线也就能轻而易举地画出来了。
3.2系统用例图
图3-1系统用例图
3.3系统用例
表3-1绘制自动机状态图
用例名称
绘制自动机状态图
简述
用鼠标点击结合键盘输入方式绘制自动机状态图
前置条件
打开软件
基本流
1.在软件菜单或工具栏中选中需要绘制的图元
2.鼠标光标变成十字架形状,表示已经进入绘图状态
3.若是绘制状态,鼠标左击窗口空白处,绘制相应的状态,状态默认为S;若是绘制关系,鼠标依次点击想要绘制的起点和终点,绘制相应的关系,输入符号默认为a
4.选中绘制的状态圆或者关系弧(选中的图形会出现小方格表示选中状态),右击,出现快捷菜单,选择“删除”菜单来删除图元,选择“属性”菜单来修改图元的状态和输入符号
5.重复步骤3,4,直到图形绘制完成
备选流
2.1鼠标右击,取消绘图,鼠标变成箭头形式
3.1绘制一个图形后,光标回到初始状态,绘图结束,若需要继续画图,需重新选择图元。
3.2绘制关系弧线时,若没有选择图元,光标回到初始状态,绘图结束
3.3允许绘制从一个状态回到该状态本身的弧。
4.1删除状态时应先删除和它联系的关系弧,否则会出错
4.2允许一个状态既是初态又是终态,只需要在属性栏中将“初态”和“终态”多选框都选上
4.3允许一条弧上有多个输入符号,只需要选择弧,右击选择“属性”菜单,用“重置”和“添加”按钮设置输入符号,输入符号不允许空
后置条件
自动机状态图绘制完成
特殊需求
只能绘制指定的图元,关系只能绘制成弧线
待解决问题
3.1由于弧线的确定是根据状态位置来的,所以不允许两个状态之间有两条同向的弧
4.1因为弧线范围难于确定,选择弧线存在一定的误差。
4.2因为同一条弧线上允许多个输入符号,所以弧线属性的设置不是很人性化。
表3-2状态图的文件操作
用例名称
状态图的文件操作
简述
状态图的文件操作,包括文件的新建,保存,读取
前置条件
打开软件
基本流
1,点击新建文件,清空窗口当前内容
2,对一个绘制好的状态图,点击保存,弹出文件对话框,选择相应的路径,输入文件文件名,保存文件
3,点击打开文件,弹出文件对话框,选择相应的路径和文件,打开文件,在窗口显示状态图
备选流
3.1如果打开的文件格式不同,会弹出“非预定格式文件”窗口
3.2同一时间内只能打开一个文件
后置条件
文件新建,保存,读取完成
特殊需求
只能打开本程序保存的文件
表3-3状态图转化为状态装换矩阵
用例名称
状态图转化为状态装换矩阵
简述
状态图转化为状态装换矩阵
前置条件
自动机状态图已经绘制完成
基本流
1,点击菜单栏中的“操作->生成状态转换矩阵”或者点击
按钮,生成状态转换矩阵
后置条件
在弹出窗口显示状态转换矩阵
表3-4状态装换矩阵转化为状态图
用例名称
状态装换矩阵转化为状态图
简述
将文件中的状态转换矩阵转换为状态图
前置条件
描述状态转换矩阵的文件已经存在
基本流
1,点击菜单栏中的“操作->生成状态转换图”或者点击
按钮,当前窗口内容清空,弹出状态转换的窗口。
2,点击打开文件按钮,打开指定格式的文件。
在窗口中显示自动机的状态集,输入符号集,初态,终态集和状态转换函数。
3,点击生成状态图,在窗口生成状态转换图
备选流
2,点击取消,不做任何处理
后置条件
由状态转换矩阵文件画出新的状态图
特殊需求
状态转换矩阵文件的格式固定,具体为:
第一行,初态;第二行,终态集;第三行,状态集;第四行,输入符号集;以后是状态转换函数,格式为:
SSa(S状态,a输入符号)
待解决问题
因为状态转换矩阵读取不方便,所以在状态转换矩阵文件写出了自动机的格式,方便读取和操作
3.4开发环境
在win7的环境下,使用visualC++6.0的MFC标准编写完成。
4详细设计
4.1系统的类图
4.2主要算法的流程图
图4-1词法分析程序流程图
4.3数据分析与定义
4.4
数据类别
成员变量
成员类型
功能描述
CRelation
m_BeginPoint,m_EndPoint;
CPoint
弧线的起点和终点
xmin,xmax,ymin,ymax;
int
弧线网格闭包的描述
m_nBeginm_nEnd;
int
弧线起始状态和终止状态的索引
m_Marks[100]
char
弧上输入符号的链表
m_pStatusList;
CObArray*
状态链表指针
m_nMarkNum;
int
输入符号的符号个数
CStatus
m_circle;
CPoint
状态的圆心坐标
m_cStatus
char
状态的表示符号
m_bIsBegin
BOOL
状态是否是初态
m_bIsEnd;
BOOL
状态是否是终态集
CCompilerDoc
m_StatusList
CObArray
状态链表
m_RelationList
CObArray
关系链表
CCompilerView
m_bIsSelected;
BOOL
表示是否选中了图形
m_nSelectedType;
int
选中图形的类型
m_nSelectedIndex;
int
选中图形在链表中的索引号
m_nGraphType;
int
绘图时将要绘制的图元
m_nFirstIndex;
int
画弧线时,选中的第一个点
CAutomaton
m_pSList;
CObArray*
状态链表指针
m_pRList;
CObArray*
关系链表指针
CAutomToGraphDlg
Start,end[10];
char
初态和终态集
status[30],mark[30]
char
状态集和输入符号集
relation[30][30];
Node(自定义)
状态之间关系
m_pStatusList,
CObArray*
状态链表指针
m_pRelationList;
CObArray*
关系链表指针
4.4系统界面设计
系统界面设计包括菜单,工具栏,右键快捷菜单。
程序界面如下:
图4-3程序运行界面
5测试方法和测试结果
5.1测试用例1
测试目的:
测试能否绘制自动机状态图
1,绘制一个状态
图5-1
2,选中,右键菜单修改状态属性
图5-2
3,关系弧线绘制
选择起点选择终点,绘制弧线
图5-3图5-4
4,关系弧属性修改
图5-5
5,重复上述过程,绘制自动机状态图
图5-6
5.2测试用例2
测试目的:
绘制状态转换矩阵
1,状态转换图
图5-7
2,状态转换矩阵
图5-8
5.3测试用例3
测试目的:
测试文件的保存,读取,新建
1,绘制的状态图
图5-9
2,保存文件
图5-10
3,新建文件
图5-11
4,打开文件
图5-12
图5-12
5.4测试用例4
测试目的:
测试状态转换矩阵转化为状态图
1,点击生成状态转换图按钮
图5-13
2,在外部新建指定格式的文件
图5-14
4,点击打开文件
图5-15
5,得到自动机
图5-16
6,生成状态图
图5-17
结论和展望
结论
程序用圆表示状态,用弧线表示状态间的关系,基本上比较美观地实现了自动机的绘制。
并且添加了快捷菜单,可以帮助用户方便地编辑,修改,删除图元,同时可以由已知的状态图得到状态装换矩阵。
本程序还实现了选作功能:
由状态转换矩阵得到状态图。
虽然本次课设的内容比较简单,但是在实现过程中,依然出现了众多的问题,主要体现在弧线的绘制和坐标确定上。
在状态集和输入符号集的描述上,本程序只能处理单个字符,有一定的局限性。
在由状态矩阵生成状态图过程中,状态的坐标只能人为地确定在某个区域,做出来的图形比较混乱。
展望
本次实验的不足还有很多,在选中图元的过程中,由于弧线范围难于确定,因而弧线不容易选中。
在状态集和输入符号集的描绘,只能使用单个字母表示,否则会出现错误。
在转移矩阵的生成过程中,状态之际的顺序只能依靠程序的输入顺序,生成的转换矩阵不美观。
在状态图的生成过程中,坐标只能人为地规定,生成的状态图比较混乱。
收获:
通过本次实验,我收获了很多东西。
首先对编译有了进一步的深刻理解,对有限状态自动机有了更深刻的认识。
在编程方面,我学会了如何更好地整体把握和控制程序,同时,我学会了如何更加准确地描绘一个图形,以及图形元素的结合使用。
在数据结构方面,我学会了如何更准确地进行图搜索和生成图。
学习编译技术课程的体会和对本门课程的评价
在做实验的过程中,发现自己对计算机中数学原理的应用不是很娴熟,不能快速地把数学几何理论应用到程序当中来。
同时,在编程过程中,发现自己总是会忽略各种细节;在整体规划上,不能有效地进行整体规划,导致前后矛盾,写了很多多余的函数和变量,不仅浪费了编程时间,也增加了调试难度。
参考文献
[1]张素琴,吕映芝,蒋维杜等.编译原理(第二版)[M].北京:
清华大学出版社,2012.6,55-74
[2]阎光伟,彭文,徐林茜.VisualC++程序设计教程(第三版)[M].北京:
中国电力出版社,2011.8
[3]