一种高效易维护有限状态机的实现方法技术

技术编号:2850694 阅读:239 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及一种高效、易维护有限状态机的实现方法。该方法采用二级表结构,一级表是“状态-事件跳转表”,二级表是“状态-事件处理表”。采用查表方式,实现“状态-事件”处理。若表中有需要处理的事件,则跳转到相应的处理函数;若没有,则跳转到默认的处理函数。“状态-事件处理表”中,事件号可以随意编号,表项可以任意增删,不同表之间互不影响。

【技术实现步骤摘要】

本专利技术涉及一种实现有限状态机的方法,尤其涉及一种实现具有高效率,且便于维护的有限状态机的方法,属于计算机编译

技术介绍
有限自动机(Finite Automata Machine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(Finite State Machine),是一种应用非常广泛的软件设计模式(Design Pattern)。有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。与其他常用的设计模式有所不同,程序员要想在自己的软件中加入有限状态机时,必须再额外编写一部分用于逻辑控制的代码,如果系统足够复杂的话,这部分代码的实现和维护相当困难。目前在实现有限状态机时,常见的方法有以下两种方法一使用switch-case语句。这是最简单也是最直接的一种方式,其基本思路是为状态机中的每一种状态都设置一个case分支,专门用于对该状态进行控制。使用switch-case语句实现的有限状态机能够很好地工作,但代码的可读性并不十分理想,主要原因是在实现状态之间的转换时,检查转换条件和进行状态转换都是混杂在当前状态中完成的。显然,如果在每种状态下都需要分别检查多个不同的转换条件,并且需要根据检查结果让状态机切换到不同的状态,那么这样的代码将是枯燥而难懂的。在很长一段时期内,使用switch-case语句一直是实现有限状态机的唯一方法,甚至像编译器这样复杂的软件系统,大部分也都直接采用这种实现方式。但随着状态机应用的逐渐深入,构造出来的状态机越来越复杂,这种方法也开始面临各种严峻的考验,其中最令人头痛的是,如果状态机中的状态非常多,或者状态之间的转换关系异常复杂,那么简单地使用switch-case语句构造出来的状态机将是不可维护的。方法二使用函数指针数组。因为有限状态机本质上就是一个“状态-事件”二维矩阵问题,因此在实现上可以采用二维函数指针数组的方法,形如(*processs)()process_function[state][event]的形式。这种方法的缺陷是event(事件)的编号必须从0开始连续编号,如果某个状态下增加一个事件,其它状态即使不需要考虑这个事件,也需要增加相应的处理,以保证矩阵的完整性。当系统复杂到一定程度时维护性就很差,甚至不可维护。
技术实现思路
本专利技术的目的在于提供一种新的实现有限状态机的方法。该方法实现的有限状态机既能保证高效,又简单易维护,并且可适用于任何系统。为实现上述的专利技术目的,本专利技术采用下述的技术方案,其特征在于将有限状态机中状态与事件之间的关系分为两层,第一层为状态值的索引,第二层为每一状态下需要处理的事件和该事件相应的处理函数;通过所述第一层的状态值索引,搜索是否有需要处理的事件,若有,则进入第二层,获得与所述需要处理的事件相应的处理函数;若没有,则执行返回语句或输出提示信息。所述第一层中,以当前状态值为索引建立一级表“状态—事件跳转表”。所述“状态—事件跳转表”中,数组下标为状态编号,编号从0开始。所述第二层中,为每一个状态分别建立二级表“状态—事件处理表”。所述“状态—事件处理表”中,对不同的事件和相应的处理函数加以编号,所述编号为任意编号。各所述“状态—事件处理表”之间互不影响。所述“状态—事件处理表”中,以0xFFFF作为结束标志。本专利技术采用二级表结构实现高效易维护的有限状态机,一级表是“状态—事件跳转表”,二级表是“状态—事件处理表”。采用查表方式,实现“状态—事件”处理。这样实现的有限状态机结构清晰,既高效又简单易维护。附图说明下面结合附图和具体实施方式对本专利技术作进一步的说明。图1为本专利技术所述方法的实施示意图。具体实施例方式作为计算机编译领域的公知常识,有限状态机分为两种基本形态,分别是不确定性有限状态机(NFA)和确定性有限状态机(DFA)。不确定性有限状态机NFA M是一个五元式M=(Q,Vt∪{ε},δ,q0,F),其中Q有穷状态集合;Vt∪{ε}输入事件表与空串所组成的集合之和。即状态机状态转换函数中的变量可以是输入事件表中的事件,也可以是空串ε;δ状态转换函数,为Q×Vt∪{ε}->2Q,其中2Q为Q的幂集;q0开始状态F终止状态集,FQ确定性有限状态机M’是一个五元式M’={Q,Vt,δ,q0,F},其中Q有穷状态集合;Vt输入事件表;δ状态转换函数,为Q×Vt->Q的映射;q0开始状态,q0∈Q;F终止状态集,FQ. 函数δ定义状态转换,用δ(q,a)=p表示,其中,q、p∈Q,a ∈Vt。δ指示当状态机处于状态q,且a是下一个输入字符时,状态机状态将由q变成p。所谓确定有限状态机是指该状态机只有一个开始状态q0,且δ是单值函数。不确定性有限状态机(NFA)和确定性有限状态机(DFA)的主要区别在于状态转移函数不一样。NFA对同一个字符串输入完全有可能有多种理解方式,而DFA则只有唯一的一种理解方式。作为形式语言的基本常识,不确定性有限状态机和确定性有限状态机在数学上是等价的,可以相互转换。转换的方法可以采用现在广泛采用的子集化算法。本专利技术所述的实现高效、易维护有限状态机的方法的核心思想在于将原有单层逻辑结构的有限状态机加以分解,使原有单层次的“状态”—“事件”关系分为两层,即用二级表结构来实现有限状态机。其中,以有穷状态集合Q中的当前状态值为索引建立一级表—“状态—事件跳转表”;以每个状态的事件号和相关的处理函数为基础构建二级表—“状态—事件处理表”。参照图1所示,在有限状态机中,采用查表方式实现“状态—事件”处理。若表中有需要处理的事件,则跳转到相应的处理函数;若没有,则跳转到默认处理函数。该默认处理函数执行返回语句或输出适当的提示信息。为此,作为本方法的第一步是定义有限状态机的结构。其具体的内容主要包括事件编号和相应的处理函数。实现这一步的伪代码如下所示//状态机定义typedef struct{unsigned int event;//事件编号void(*process_func)();//处理函数}STATE_MC;作为下一步,需要进一步定义每个状态的“状态—事件处理表”。“状态—事件处理表”具体包括该状态下需要处理的事件和该事件相应的处理函数。在“状态—事件处理表”中,事件号可以随意编号,表项可以任意增删,不同表之间互不影响。作为一个实施例,处理表以0xFFFF作为结束标志,对应着默认处理函数。该结束标志也可以采用其它的字符来表示。实现本步骤的伪代码如下所示//各个状态的状态-事件处理表//state 0STATE_MC state_0[]={{event_1,st0_event_1_process},//状态0下对事件1的处理,处理函数st0_event1_process{event_2,st0_event2_process},//状态0下对事件2的处理,处理函数st0_event2_process……{0xFFFF,st0_default_process}//默认处理};//state 1STATE_MC state_1[]={{event_1,st1_event1_process},//状态1下对事本文档来自技高网
...

【技术保护点】
一种高效易维护有限状态机的实现方法,其特征在于:将有限状态机中状态与事件之间的关系分为两层,第一层为状态值的索引,第二层为每一状态下需要处理的事件和该事件相应的处理函数;通过所述第一层的状态值索引,搜索是否有需要处理的事件, 若有,则进入第二层,获得与所述需要处理的事件相应的处理函数;若没有,则执行返回语句或输出提示信息。

【技术特征摘要】
1.一种高效易维护有限状态机的实现方法,其特征在于将有限状态机中状态与事件之间的关系分为两层,第一层为状态值的索引,第二层为每一状态下需要处理的事件和该事件相应的处理函数;通过所述第一层的状态值索引,搜索是否有需要处理的事件,若有,则进入第二层,获得与所述需要处理的事件相应的处理函数;若没有,则执行返回语句或输出提示信息。2.如权利要求1所述的高效易维护有限状态机的实现方法,其特征在于所述第一层中,以当前状态值为索引建立一级表“状态-事件跳转表”。3.如权利要求2所述的高效易维护有限状态机的实现方法,其特征在于所述“状态-事件跳转表...

【专利技术属性】
技术研发人员:于连庆
申请(专利权)人:北京佳讯飞鸿电气有限责任公司
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1