基于正则文法的自动机生成系统.doc_第1页
基于正则文法的自动机生成系统.doc_第2页
基于正则文法的自动机生成系统.doc_第3页
基于正则文法的自动机生成系统.doc_第4页
基于正则文法的自动机生成系统.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

键入公司名称面向对象技术课程设计基于正则文法的自动机生成系统在此处键入文档的摘要。摘要通常是对文档内容的简短总结。在此处键入文档的摘要。摘要通常是对文档内容的简短总结。目录1 需求分析11.1 课程设计题目11.2 课程设计基本要求11.2.1 功能要求11.2.2 人机交互要求22 系统概要说明32.1 设计思想32.2 系统框架32.3 开发工具及开发过程说明33 用例分析43.1 角色说明43.2 用例图43.3 用例说明53.3.1 输入正则文法用例53.3.2 修改正则文法用例53.3.3 保存新创建的文法和自动机用例63.3.4 保存用户修改用例73.3.5 装入正则文法和自动机用例83.3.6 选中自动机某节点用例83.3.7 选中自动机某弧线用例93.3.8 选中某条产生式用例103.3.9 调整节点位置用例103.3.10 调整弧线位置用例114 系统静态建模124.1 类图124.2 类文档134.2.1 Triple类134.2.2 Regular类134.2.3 FiniteAutomata类144.2.4 Geometry类154.2.5 RelationGraph154.2.6 ControlPoint类164.2.7 State类174.2.8 InitialState类184.2.9 FinalState类185 系统动态建模195.1 序列图195.1.1 输入正则文法195.1.2 修改正则文法205.1.3 保存新创建的文法和自动机205.1.4 保存用户修改215.1.5 装入文法和自动机215.1.6 选中自动机某节点225.1.7 选中自动机某条弧225.1.8 选中某条产生式235.1.9 调整节点位置235.1.10 调整弧线位置245.2 状态图245.3 活动图255.3.1 输入文法,生成自动机255.3.2 修改文法,更新状态图265.3.3 移动图元275.3.4 存储、读入285.3.5 FiniteAutomata初始化285.3.6排布所有状态图State295.3.7绘制转移曲线295.3.8优化关系曲线296 系统详细设计306.1 Triple类306.2 Regular类306.3 Geometry类316.4 ControlPoint类316.5 State类316.6 InitialState类326.7 FinalState类326.8 RelationGraph类326.9 FiniteAutomata类337 使用说明347.1 界面说明347.1.1 菜单设计347.1.2 工具栏设计357.2 人机交互说明367.2.1 新建正则文法367.2.2 保存正则文法387.2.3 装入正则文法387.2.4 调整自动机40431 需求分析1.1 课程设计题目基于正则文法的自动机生成系统1.2 课程设计基本要求1.2.1 功能要求该系统必须实现以下功能:(1) 正则文法的文本编辑功能 必须支持正则文法的输入、保存、修改、装入,每个操作的具体要求如下: 输入正则文法:打开编辑对话框,输入正则文法、生成自动机后,显示自动机。 保存正则文法:保存正在编辑的正则文法和自动机,到指定文件。 编辑正则文法:打开编辑对话框,装入正则文法,进行编辑后,显示自动机。 装入正则文法:装入指定文件中的正则文法和自动机,显示自动机。(2) 正则文法到自动机的转换功能 根据当前输入的正则文法,生成相应的自动机,并在窗口中显示自动机的图形。(3) 自动机的图形显示与调整图形显示组成自动机的各个节点和转移关系,节点使用圆表示,转移关系使用弧线表示,如“图1-1”所示,其中,两个圆(如图中的“X”)表示自动机的终止状态。图1-1此外,系统需要允许用户使用鼠标移动各个节点的位置,以调整自动机的显示,并且在保存正则文法时,也必须保存其自动机图形。1.2.2 人机交互要求系统要支持菜单命令、鼠标操作。(1)菜单命令菜单中需要有新建、保存、编辑、装入等菜单项,每个菜单项所需要实现的功能参见“1.2.1 功能要求”。(2)鼠标操作 系统必须允许用户拖动自动机显示中的各个节点,以调整自动机的显示,节点之间的转移关系弧线应随着节点移动。此外,自动机各个节点的位置能随着自动机保存,从文件中装入该正则文法和自动机后,自动机中各个节点、弧线的位置应该与保存时一致。2 系统概要说明2.1 设计思想在设计上,采取了文档与视窗的分离(文档视图架构)。文法对象和状态转移图对象分离。各类高内聚、低耦合。各个图元之间某些属性与方法都是相同,因此可以利用面向对象中的继承与多态思想为各个图元设置一个基类:Geometry类。2.2 系统框架图 2-12.3 开发工具及开发过程说明用StarUML进行UML建模,使用了StarUML进行正向工程,自动生成了部分类代码,在此基础之上,使用Microsoft Visual C+ 6.0和MFC开发、编译和运行程序。系统采用用例驱动的UML建模方法。用例驱动的方法基于面向对象技术,从用例出发,首先在需求分析阶段建立用例模型,用用例图来表示;其次,在对用例描述和分析的基础上,得出系统的核心类,用类图表示;再次,进一步描绘出系统的静态结构和动态行为,分别用状态图和序列图来表示,然后进行编码、测试。3 用例分析3.1 角色说明与系统进行交互的主要是使用该系统的用户。在交互过程中,用户可以启动、关闭系统,可以通过菜单命令输入、编辑正则文法,系统则会向用户显示相应文法的自动机,用户通过鼠标操作可以调整自动机中节点、弧线的位置,还可以通过菜单命令将正则文法、自动机的位置信息保存到文件中,也可以将某个文件所保存的文法、自动机装入到系统中。3.2 用例图本系统的用例图如“图3-1”所示,对各个用例的详细阐述参见“3.3 用例说明”。图 3-1其中需要说明的是,“选中某条产生式”是指在系统所显示的当前正则文法的产生式列表中,用鼠标选中某条产生式,使得自动机中对应该产生式的节点、弧线同时处于被选中状态。具体请参见“3.3.8 选中某条产生式用例”。3.3 用例说明3.3.1 输入正则文法用例主参与者:用户目标:用户能够输入一个新的正则文法前置条件:系统已启动触发器:用户点击“新建”菜单命令或是工具栏“新建”图标场景:用户系统1、 点击“新建”菜单命令或是工具栏“新建”图标。2、 输入正则文法的所有产生式。3、 点击“完成”,确认输入。1、 弹出输入对话框,并给出输入规则,等待用户输入正则文法。2、 检查用户输入是否合法:若不合法,提示用户重新输入;若合法,则关闭输入对话框,并将用户输入保存到系统数据缓冲区中。后置条件:系统进入“等待”状态,等待用户进行操作。异常:1、用户输入的文法格式不符合系统要求(如输入“:=”而不是“:=”,或者用户输入的不是正则文法)用户点击“完成”按钮后,弹出对话框提示用户输入的不是正则文法,请用户重新输入。优先级:高使用频率:经常约束:1、数据源:输入对话框2、数据格式:正则文法中只能包括英文字母,大写字母表示变量,小写字母表示终极符,“:=”表示“推导”关系,并且为实现方便,要求用户只能输入右线性正则文法,即用户只能输入“A := aB”、“A := a”这样的产生式,不能输入“A := Ba”这样的产生式。3.3.2 修改正则文法用例主参与者:用户目标:修改已有的正则文法,并且修改文法后,系统能根据修改后的文法,显示新的自动机。前置条件:系统已启动,并且系统数据缓冲区中已存在至少一个正则文法。触发器:用户激活某文法的窗口,并按下该文法的产生式列表下的“修改”按钮。场景:用户系统1、 激活某文法的窗口,并按下该文法的产生式列表下的“修改”按钮。2、 修改正则文法。3、 点击“确认”按钮,确认完成修改。1、 弹出一个“修改”对话框,显示用户选定的正则文法的具体内容,并且该文法处于可编辑的状态。2、 即时显示用户修改后的正则文法。3、 检查修改后的文法是否合法:若合法,则更新系统数据缓冲区中所保存的数据,并关闭“修改”对话框;若不合法,则弹出对话框,给出相应的提示信息,提示用户重新修改。4、 根据修改后的文法,显示对应的自动机。后置条件:系统进入“等待”状态,等待用户进行操作。异常:1、用户修改后的文法不是正则文法系统弹出对话框,提示用户重新修改。2、用户修改后的文法格式不符合系统要求系统弹出对话框,提示用户重新修改。优先级:较高,必须在显示功能之后实现使用频率:经常约束:1、数据源:系统数据缓冲区中已保存的数据,对话框中用户输入的数据2、约束:对正则文法的输入要求参见“输入用例”3.3.3 保存新创建的文法和自动机用例主参与者:用户目标:保存用户新创建的正则文法和自动机,其中自动机需要保存各节点位置、表示推导关系的弧线的位置信息。前置条件:系统已启动,用户已输入一个新的正则文法,但尚未保存。触发器:用户点击“保存”菜单命令或是工具栏“保存”图标场景:用户系统1、 点击“新建”菜单命令或是工具栏“新建”图标。2、 选择好保存位置,输入文件名,点击“确认”按钮。1、 弹出对话框,提示用户选择保存位置和文件名。2、 读取用户输入,判断路径和文件名是否合法。3、 在用户指定位置,以用户输入名创建一个新文件,将正则文法、自动机的位置信息写入到文件中。4、 关闭对话框。后置条件:系统进入“等待”状态,等待用户进行操作。异常:1、用户输入的文件名不符合Windows系统中文件的命名规范系统给出提示信息,要求用户重新输入文件名。2、用户所选择的文件夹中存在同名文件系统弹出对话框,提示用户重名,要求用户重新输入文件名。优先级:较高,必须在显示功能之后实现使用频率:经常约束:1、数据源:系统数据缓冲区中已保存的数据,对话框中用户输入的数据2、约束:用户输入的文件名必须符合Windows系统中文件的命名规范,即文件名中必须满足如下要求: 允许文件或者文件夹名称不得超过255个字符。 文件名除了开头之外任何地方都可以使用空格。 文件名中不能有下列符号:“?”、“、”、“”、“*”、“”、“”、“”、“|”。3.3.4 保存用户修改用例主参与者:用户目标:保存用户对自动机中节点、弧线的位置,以及正则文法所做的修改。前置条件:系统已启动,并且系统数据缓冲区中已存在一个正则文法(用户新输入并已经保存过的文法,或是从文件读取的正则文法),并且显示区域已给出该正则文法所对应的自动机。触发器:用户点击“保存”菜单命令或是工具栏“保存”图标。场景:用户系统1、 点击“保存”菜单命令或是工具栏“保存”图标。1、 清空存有该正则文法的文件中的所有信息,将修改后的正则文法、自动机的位置信息保存到该文法文件中。后置条件:系统进入“等待”状态,等待用户进行操作。异常:1、保存该文法的文件在进行“保存”操作前被删除,无法找到相应文件根据文件名,创建新的文件,并将正则文法和自动机的位置信息保存到这个文件中。优先级:较高,必须在显示功能之后实现使用频率:经常约束:1、数据源:系统数据缓冲区中已保存的数据。2、约束:文件名必须符合Windows系统中文件的命名规范,具体要求请参见“保存新的正则文法用例”。3.3.5 装入正则文法和自动机用例主参与者:用户目标:将用户指定的文件中所保存的正则文法和自动机装入到系统中,并显示该正则文法和自动机。前置条件:系统已启动,并且存在一个文件,该文件按照系统指定格式保存有正则文法以及相应的自动机信息。触发器:用户点击“打开”菜单命令或是工具栏“打开”图标。场景:用户系统1、 点击“打开”菜单命令或是工具栏“打开”图标。2、 选择某个文件,点击“确定”按钮。1、 弹出“打开”对话框,提示用户选择装入文件。2、 关闭对话框,读取相应文件,将该文件中的正则文法、自动机信息保存到系统中。3、 显示自动机和正则文法。后置条件:系统进入“等待”状态,等待用户进行操作。异常:1、用户指定的文件保存格式不符合系统要求系统弹出对话框,要求用户指定一个新的装入文件。2、用户指定的文件所保存文法不是正则文法系统弹出对话框,要求用户指定一个新的装入文件。优先级:较高,必须在保存功能之后实现使用频率:经常约束:1、数据源:保存有正则文法、自动机位置信息的文件。2、约束:文件中的数据必须按照系统的指定格式书写。尚未解决的问题:在文件中,正则文法、自动机的位置信息应该以什么形式保存?3.3.6 选中自动机某节点用例主参与者:用户目标:选中自动机某个节点,使其处于选中状态。前置条件:系统已启动,并且系统中已存在一个正则文法,显示区中已显示该文法所对应的自动机。触发器:用户在自动机某个节点的位置上按下鼠标左键。场景:用户系统1、 在自动机某个节点的位置上按下鼠标左键。1、 读取鼠标所在位置的坐标,判断是否有节点被选中:如果这个坐标在节点圆上或圆内,则该节点被选中,将其高亮显示,并显示与该节点有关的弧的控制点;否则,不进行任何操作。后置条件:系统进入“等待”状态,等待用户进行操作。异常:无优先级:较高,必须在显示功能之后实现。使用频率:经常约束:1、数据源:系统数据缓冲区中已有的数据,鼠标按下时的坐标。2、约束:要选中一个节点,则必须按下鼠标左键,并且鼠标所在位置的坐标必须在节点圆上或是节点圆内。3.3.7 选中自动机某弧线用例主参与者:用户目标:选中某个弧线,使其处于选中状态。前置条件:系统已启动,并且系统中已存在一个正则文法,显示区中已显示该文法所对应的自动机。触发器:用户在自动机某条弧线显示有终极符的位置上按下鼠标左键;选中自动机某个节点。场景:用户系统1、 在自动机某条弧线显示有终极符的位置上按下鼠标左键,或是选中自动机的某个节点。1、 读取鼠标所在位置的坐标,判断是否有弧线被选中:如果这个坐标在某条弧终极符附近,则该弧线被选中,显示该弧线的两个控制点;否则,不进行任何操作。如果是选中了自动机某个节点,则显示与该节点有关系的所有弧线的控制点。后置条件:系统进入“等待”状态,等待用户进行操作。异常:无优先级:较高,必须在显示功能之后实现使用频率:经常约束:1、数据源:系统数据缓冲区中已有的数据,鼠标按下时的坐标。2、约束:要选中一条弧线,则必须按下鼠标左键,并且鼠标所在位置的坐标必须在该弧线终极符的附近。3.3.8 选中某条产生式用例主参与者:用户目标:选中正则文法中的某个产生式,使自动机中对应的节点、弧线高亮显示。前置条件:系统已启动,并且系统中已存在至少一个正则文法,显示区中已显示该文法所对应的自动机。触发器:用户在显示区左侧的产生式列表中,按下鼠标左键。场景:用户系统1、 在显示区左侧的产生式列表中,按下鼠标左键。1、 读取鼠标按下位置的坐标,判断用户是否选中了某条产生式:如果在该坐标有一条产生式,则将该产生式对应的自动机中的节点高亮显示,显示对应弧线的控制点;没有则不进行任何操作。后置条件:系统进入“等待”状态,等待用户进行操作。异常:1、用户按下的位置没有产生式:系统不进行任何响应。优先级:低,必须在显示功能之后实现使用频率:经常约束:1、数据源:系统数据缓冲区中已有的数据,鼠标按下时的坐标。2、约束:用户鼠标按下的位置必须有一条产生式才可以。3.3.9 调整节点位置用例主参与者:用户目标:调整图形显示中,用于表示正则文法变量的节点,并且节点位置移动后,与该节点有关系的弧线也随之移动。前置条件:系统已启动,并且系统中已存在一个正则文法,并且该文法所对应的自动机已在显示区中画出。触发器:用户在自动机某个节点的位置上按下鼠标左键。场景:用户系统1、 在自动机某个节点的位置上按下鼠标左键。2、 拖动鼠标,移动至合适的位置。3、 鼠标左键抬起。1、 将相应节点高亮显示,同时显示与该节点有关系的各弧线的控制点。2、 读取鼠标当前位置,改变当前被“选中”的节点的坐标,并重新绘制该节点,计算与该节点有关系的弧线的新坐标,并重新绘制这些弧线。后置条件:系统进入“等待”状态,等待用户进行操作。优先级:较高,必须在显示功能之后实现使用频率:经常约束:1、数据源:系统数据缓冲区中已保存的数据2、约束:在拖动节点时,只有鼠标左键点击表示节点的圆形内部或圆形边,才可以选中该节点。尚未解决的问题:1、用户把一个节点圆拖动到另一个节点圆上时,应该如何处理?3.3.10 调整弧线位置用例主参与者:用户目标:调整自动机中,用于表示正则文法推导关系的弧线。前置条件:系统已启动,并且系统中已存在一个正则文法,并且该文法所对应的自动机已在显示区中画出。触发器:用户在自动机某条弧线的终极符上按下鼠标左键。场景:用户系统1、 在自动机某条弧线的终极符上按下鼠标左键,然后抬起。2、 按下鼠标左键,选择一个控制点。3、 拖动鼠标,移动至合适的位置。4、 鼠标左键抬起。1、 显示相应弧线的两个控制点。2、 读取鼠标按下位置的坐标,判断当前用户选中的是哪个控制点。3、 读取鼠标位置,更改用户选中的控制点的坐标,并根据更改后的坐标信息,重新绘制弧线。后置条件:系统进入“等待”状态,等待用户进行操作。优先级:较高,必须在显示功能之后实现使用频率:经常约束:1、数据源:系统中已保存的数据2、约束:在拖动控制点时,只有鼠标左键点击表示控制点的圆形内部或圆形边时,才能够拖动该控制点。尚未解决的问题:1、当用户拖动弧线,使两条弧线有交叉时,应该如何处理?4 系统静态建模4.1 类图图 4-14.2 类文档共9个类,下面分别给出具体说明。4.2.1 Triple类图4-2说明:表示一个产生式,例如产生式“A:=aB”。 对象关联 若干产生式构成一个正则文法。 属性: var1: char 产生式中的第一个非终结符 ter: char 产生式中的终结符 var2: char 产生式中的第二个非终结符 行为: getVar1(): char 获得产生式中第一个非终结符 getTer(): char 获得产生式中终结符 getVar2(): char 获得产生式中第二个非终结符4.2.2 Regular类图4-3说明:表示文法。 对象关联 由若干产生式组成。 属性: t: Triple1.* 组成文法的产生式集合 行为: Recognize(rgstr: String): Bool 初始化文法。由字符串识别为文法。 getAt(idx: int): Triple 获得指定的产生式 AddTriple(tri: Triple) 添加产生式 RemoveAll() 清空文法4.2.3 FiniteAutomata类图4-4说明:表示有限状态自动机。 对象关联 由若干非终结符节点和若干有向曲线组成,使用文法。 属性: rg: RelationGraph1.* 若干有向曲线 state: State2.* 若干状态(非终结符)节点 rg: Regular 使用的文法 selected: Geometry * 被选中的图元指针 行为: Initialize(rg: Regular) 自动机的初始化 Press(x: int, y: int) 鼠标按下,选择图元操作 Move(x: int, y: int) 鼠标移动,刷新相应的被选中的图元 Release(x: int, y: int) 释放鼠标,移动结束,刷新界面。 AddSelectedGeo(geo: Geometry *) 将选中的图元加入被选中列表 RemoveAll() 清空自动机 InitPosition() 计算初始位置 SelectRegular(var1: char, ter: char, var2: char) 针对指定的三元关系时,选中相应的三元关系图4.2.4 Geometry类图4-5说明:表示图元。 对象关联 派生控制点、有向曲线、非终结符节点图元。 属性: selected: int = 0 记录选中状态,默认未选中 x: int = 0 每个子类均有x,y坐标,故抽象出来,在RG中 y: int = 0 代表终结符的位置,其他代表各自中心 行为: Draw() 图元绘制 Offset(cx: int, cy: int) 图元移动 Select(cx: int, cy: int): int 选中状态判断(仅选择时判断,移动时无需判断。 4.2.5 RelationGraph图4-6说明:表示有向曲线。 对象关联 派生自图元类;由2个控制点组成;使用非终结符节点类;实例化三元关系类;组成有限自动机。 属性: start: State * 曲线的起始状态(非终结符)节点 end: State *曲线的结束状态(非终结符)节点 p: ControlPoint*2 曲线的两个控制点 ter: char终结符字符 行为: Draw() 绘制 Offset(cx: int, cy: int) 对选中的控制点移动 Select(cx: int, cy: int): int 选中状态判断,含控制点判断 GetStart(): State*获得起始状态指针 GetEnd(): :State*获得结束状态指针 GetCp(idx: int): ControlPoint* 获得控制点指针4.2.6 ControlPoint类图4-7说明:表示有向曲线上的控制点。 对象关联 派生自图元类;组成有向曲线类;被非终结符节点类使用。 属性: visible: Bool = FALSE 控制点的可见性 行为: Draw() 绘制 Offset(cx: int, cy: int) 移动 Select(cx: int, cy: int): int 选中状态判断 DisSelect() 取消选择 EnVisible() 可见 DisVisible() 隐藏 ForceOffset(cx: int, cy: int) 强制位移,即使未被选中4.2.7 State类图4-8说明:表示非终结符节点。 对象关联 派生自图元类;使用控制点类;被有向曲线类使用;组成有限自动机类。 属性: var: char非终结符字符 cp: ControlPoint * 指向若干与当前非终结符节点相连的有向曲线的控制点 行为: GetVar(): char 获得非终结符字符 Draw() 绘制 Offset(cx: int, cy: int) 移动 Select(cx: int, cy: int): int 选中状态判断 Select() 强制选中 DisSelect() 取消选中 ForceOffset(cx: int, cy: int) 强制位移,不考虑状态,不移动控制点 AddCP(cp: ControlPoint*) 添加控制点指针 OffsetCp(cp: ControlPoint*, th: float, radius: int)位移控制点(极坐标) GetPointOnCircle(cp: ControlPoint*): Point 得到控制点与圆心连线和圆的交点 GetCPAngle(cp: ControlPoint*): float控制点相对圆心的角度4.2.8 InitialState类图4-9说明:起始状态节点。 对象关联 派生自State类。 属性: 行为: Draw() 覆盖状态类的Draw函数4.2.9 FinalState类图4-10说明:结束状态节点。 对象关联 派生自State类。 属性: 行为: Draw() 覆盖状态类的Draw函数5 系统动态建模5.1 序列图在序列图中,除了在“4 系统静态建模”中所设计的类之外,还添加了部分类,以便于说明,这些类的具体功能如下: UserInterface:用于表示系统界面,提供菜单、工具栏,接收用户命令和鼠标操作。 Document:即文档类,一个Document对象保存正则文法及其自动机的位置信息,并能够以序列化的方式保存、装入一个正则文法及其自动机。 CurView:即视图类,一个CurView对象显示某一个正则文法的自动机,系统应该允许多个CurView同时存在,即支持同时装入多个正则文法,并在不同的CurView中显示。需要说明的是,CurView对象与Document对象存在着绑定关系,CurView对象在显示自动机时,自动机各个节点、弧线的位置信息都是从Document对象中读取的。 Dialog:对话框。接收用户输入,并将输入传递给系统;显示正则文法,供用户编辑。下面给出主要用例的序列图。5.1.1 输入正则文法图5-15.1.2 修改正则文法图5-25.1.3 保存新创建的文法和自动机图5-35.1.4 保存用户修改图5-45.1.5 装入文法和自动机图5-55.1.6 选中自动机某节点图5-65.1.7 选中自动机某条弧图5-75.1.8 选中某条产生式图5-85.1.9 调整节点位置图5-95.1.10 调整弧线位置图5-105.2 状态图图元Geometry的状态图如下所示。图5-115.3 活动图5.3.1 输入文法,生成自动机图5-125.3.2 修改文法,更新状态图图5-135.3.3 移动图元图5-145.3.4 存储、读入图5-155.3.5 FiniteAutomata初始化图5-165.3.6排布所有状态图State图5-17 图5-185.3.7绘制转移曲线如图5-18。5.3.8优化关系曲线如图5-19。图5-196 系统详细设计6.1 Triple类class Triple:public CObjectpublic:Triple(char v1,char t,char v2); char getVar1(); char getTer(); char getVar2();DECLARE_SERIAL(Triple) void Serialize(CArchive &ar);private:Triple(); char var1;/左部变量 char ter;/ 终极符号 char var2;/右部变量;6.2 Regular类class Regular:public CObjectpublic:CString GetStringAll();/将文法输出文本void RemoveAll();/清空数据 Triple* GetAt(int idx);/得到某一条文法,返回三元组CString GetStringAt(int idx);/得到某一条文法,返回字符串int GetCount();/文法条数 void AddTriple(Triple tri);/增加三元组 BOOL Recognize(CString rgstr);/识别文法DECLARE_SERIAL(Regular)void Serialize(CArchive &ar);private:CObArray tripleList;/三元组的集合;6.3 Geometry类class Geometry:public CObjectpublic:Geometry(); void virtual Draw(CDC* dc)=0;/绘制 void virtual Offset(int cx, int cy)=0;/平移函数 int virtual Select(int cx, int cy)=0;/选择函数 BOOL selected ;/标识是否被选中int x;/位置坐标int y;6.4 ControlPoint类class ControlPoint : public Geometrypublic:void DisSelect();/取消选择void ForceOffset(int cx,int cy);/强制平移,不考虑是否可见 void Draw(CDC* dc); void Offset(int cx, int cy); int Select(int cx, int cy);void EnVisible();/使可见void DisVisible();/取消可见DECLARE_SERIAL(ControlPoint) void Serialize(CArchive &ar);ControlPoint();private:BOOL visible;6.5 State类class State : public Geometrypublic:float GetCPAngle(ControlPoint* cp);/控制点相对圆心的角度CPoint GetPointOnCircle(ControlPoint* cp);/得到控制点与圆心连线和圆的交点void ForceOffset(int cx,int cy);/强制位移,不考虑状态,不移动控制点void DisSelect();/取消选中void EnSelect();void OffsetCp(ControlPoint* cp,float th,int radius);/位移控制点,(极坐标)void AddCp(ControlPoint* cp);/增加控制点State(char v);char GetVar(); void Draw(CDC* dc); void Offset(int cx, int cy); int Select(int cx, int cy);DECLARE_SERIAL(State) void Serialize(CArchive &ar);State();protected: char var;CObArray cpList;/本状态控制点集合;6.6 InitialState类class InitialState : public State public:InitialState(char v);void Draw(CDC*dc);/覆盖状态类的绘制函数;6.7 FinalState类class FinalState : public State public:FinalState(char v);void Draw(CDC *dc);/覆盖状态类的Draw函数;6.8 RelationGraph类class RelationGraph : public Geometrypublic:State* GetSEnd();State* GetSStart();ControlPoint* GetCpEnd();ControlPoint* GetCpStart();RelationGraph(State *vs,State *ve,char t);/构造函数 void Draw(CDC* dc); void Offset(int cx, int cy); int Select(int cx, int cy);DECLARE_SERIAL(RelationGraph)void Serialize(CArchive &ar);RelationGraph();private:void RotatePoint(CPoint *point,float th); State *sStart; State *sEnd; ControlPoint *cpStart;ControlPoint *cpEnd; char ter;6.9 FiniteAutomata类class FiniteAutomata :public CObjectpublic:BOOL SelectRegular(char var1,char ter,char var2);/选中某一条文法void RemoveAll();/清空所有数据void AddSelectedGeo(Geometry* geo);/在已选图元集中加入图元void Draw(CDC* pDC); void Initialize(Regular *rg);/初始化数据 void Press(int x, int y);/鼠标按下 void Move(int x, int y);/鼠标移动 void Release(int x, int y);DECLARE_SERIAL(FiniteAutomata)void Serialize(CArchive &ar);private:void InitPosition();/初始化图元位置 CObArray relationList;/RelationGraph 关系图集 CObArray stateList;/状态集 Regular* regular;/文法的指针 CObArray selectedList;/已选图元集;7 使用说明7.1 界面说明7.1.1 菜单设计菜单栏主要4个菜单组成,如“图7-1”所示。图7-1每个菜单具体的菜单项、每个菜单项的功能如下:(1) File菜单所包含的菜单项如“图7-2”所示。图7-2主要的菜单项及其功能如下: New:用于新建一个正则文法,点击后弹出输入对话框,供用户输入正则文法。 Open:用于装入一个正则文法及其自动机。 Close:关闭当前处于“选中”状态的窗口。 Save:保存当前窗口中的正则文法以及自动机。 Exit:退出系统。(2) View菜单所包含的菜单项如“图7-3”所示。图7-3主要的菜单项及其功能如下: Toolbar:用于控制工具栏是否显示。 Status Bar:用于控制状态栏是否显示。(3) Window菜单主要用于选择、排列窗口,所包含的菜单项如“图7-4”所示。图7-4主要的菜单项及其功能如下: Cascade:以层叠方式显示多个窗口。 Tile:以平铺方式显示多个窗口。 New Window:为当前处于“选中”状态的窗口创建一个副本。(4) Help菜单显示系统信息。需要说明的是,在系统设计过程时,我们考虑到系统支持多个视图显示对用户而言更加方便,可以使用户同时查看多个正则文法及其自动机,但这时,如果在菜单中添加“编辑”菜单项,可能会使用户不确定这个菜单命令到底是编辑哪个正则文法,因此,我们没有在菜单中添加“编辑”菜单项,而是在每个显示自动机的视图中添加了一个“修改”按钮,以实现编辑正则文法这一功能。7.1.2 工具栏设计工具栏主要组成如“图7-5”所示。图7-5其中第一个图标对应“File”菜单中的“New”命令,第二个图标对应“File” 菜单中的“Open”命令,第三个图标对应“File” 菜单中的“Save”命令。7.2 人机交互说明7.2.1 新建正则文法点击“File”菜单中

温馨提示

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

评论

0/150

提交评论