CN1815448A - 一种高效易维护有限状态机的实现方法 - Google Patents
一种高效易维护有限状态机的实现方法 Download PDFInfo
- Publication number
- CN1815448A CN1815448A CN 200510048875 CN200510048875A CN1815448A CN 1815448 A CN1815448 A CN 1815448A CN 200510048875 CN200510048875 CN 200510048875 CN 200510048875 A CN200510048875 A CN 200510048875A CN 1815448 A CN1815448 A CN 1815448A
- Authority
- CN
- China
- Prior art keywords
- state
- finite
- state machine
- incident
- event
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种高效、易维护有限状态机的实现方法。该方法采用二级表结构,一级表是“状态-事件跳转表”,二级表是“状态-事件处理表”。采用查表方式,实现“状态-事件”处理。若表中有需要处理的事件,则跳转到相应的处理函数;若没有,则跳转到默认的处理函数。“状态-事件处理表”中,事件号可以随意编号,表项可以任意增删,不同表之间互不影响。
Description
技术领域
本发明涉及一种实现有限状态机的方法,尤其涉及一种实现具有高效率,且便于维护的有限状态机的方法,属于计算机编译技术领域。
背景技术
有限自动机(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:终止状态集,FQ
确定性有限状态机M’是一个五元式
M’={Q,Vt,δ,q0,F},其中:
Q:有穷状态集合;
Vt:输入事件表;
δ:状态转换函数,为Q×Vt->Q的映射;
q0:开始状态,q0∈Q;
F:终止状态集,FQ.
函数δ定义状态转换,用δ(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 0
STATE_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 1
STATE_MC state_1[]=
{
{event_1,st1_event1_process},//状态1下对事件1的处理,处理函数st1_event1_process
{event_2,st1_event2_process},//状态1下对事件2的处理,处理函数st1_event2_process
……
{0xFFFF,st1_default_process}//默认处理
};
……
//state n
STATE_MC state_n[]=
{
{event_1,stn_event1_process},//状态n下对事件1的处理,处理函数stn_event1_process
{event_2,stn_event2_process},//状态n下对事件2的处理,处理函数stn_event2_process
……
{0xFFFF,stn_default_process}//默认处理
};
第三步是定义“状态—事件跳转表”。该表的数组下标为状态编号,编号从0开始。其成员为每个状态的“状态—事件处理表”地址。
实现这一步的伪代码如下所示:
//状态-事件跳转表
//state-event jump table
STATE_MC*jump[MAX_STATE]=
{
state_0,state_1,……,state_n
};
第四步是定义有限状态机入口函数。这个入口函数实际上就是一个查表函数,首先以当前状态值为索引得到“状态—事件处理表”入口,搜索表中是否有需要处理的事件,若有,则跳转到相应的处理函数;若没有,则跳转到默认处理函数。
这一步骤的伪码如下所示:
//有限状态机入口函数
void event_process(unsigned int CurState,unsigned int EventNo)
{
STATE_M*base;
//查表,跳转到相应的服务函数
base=jump[CurState];
while((base->event!=EventNo)&&(base->event!=0xFFFF))base++;
base->process func();
return;
}
至此,完整地实现了一种新的实现有限状态机的方法。用这种方法实现的有限状态机,维护工作变得非常简单。该维护工作主要是根据实际需要,维护一张“状态—事件处理表”,查表程序做好之后可以一劳永逸。“状态—事件处理表”的大小由实际应用决定,某状态下如果需要处理某事件,则增加一项;如果不需要处理,则不用考虑。“状态—事件处理表”中,事件号可以随意编号,表项可以任意增删,不同表之间互不影响。
以上对本发明进行了详细的说明,但显然本发明的具体实现形式并不局限于此。对于本技术领域的一般技术人员来说,在不背离本发明所述方法的精神和权利要求范围的情况下对它进行的各种显而易见的改变都在本发明的保护范围之内。
Claims (7)
1.一种高效易维护有限状态机的实现方法,其特征在于:
将有限状态机中状态与事件之间的关系分为两层,第一层为状态值的索引,第二层为每一状态下需要处理的事件和该事件相应的处理函数;
通过所述第一层的状态值索引,搜索是否有需要处理的事件,若有,则进入第二层,获得与所述需要处理的事件相应的处理函数;若没有,则执行返回语句或输出提示信息。
2.如权利要求1所述的高效易维护有限状态机的实现方法,其特征在于:
所述第一层中,以当前状态值为索引建立一级表“状态-事件跳转表”。
3.如权利要求2所述的高效易维护有限状态机的实现方法,其特征在于:
所述“状态-事件跳转表”中,数组下标为状态编号,编号从0开始。
4.如权利要求1所述的高效易维护有限状态机的实现方法,其特征在于:
所述第二层中,为每一个状态分别建立二级表“状态-事件处理表”。
5.如权利要求4所述的高效易维护有限状态机的实现方法,其特征在于:
所述“状态-事件处理表”中,对不同的事件和相应的处理函数加以编号,所述编号为任意编号。
6.如权利要求4所述的高效易维护有限状态机的实现方法,其特征在于:
各所述“状态-事件处理表”之间互不影响。
7.如权利要求4所述的高效易维护有限状态机的实现方法,其特征在于:
所述“状态-事件处理表”中,以0xFFFF作为结束标志。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200510048875 CN1815448A (zh) | 2005-12-31 | 2005-12-31 | 一种高效易维护有限状态机的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200510048875 CN1815448A (zh) | 2005-12-31 | 2005-12-31 | 一种高效易维护有限状态机的实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1815448A true CN1815448A (zh) | 2006-08-09 |
Family
ID=36907666
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200510048875 Pending CN1815448A (zh) | 2005-12-31 | 2005-12-31 | 一种高效易维护有限状态机的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1815448A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101957751A (zh) * | 2010-06-04 | 2011-01-26 | 福建星网锐捷网络有限公司 | 一种状态机的实现方法及装置 |
CN102591713A (zh) * | 2011-12-31 | 2012-07-18 | 浙江大学 | 基于有限状态机的软件功能模块的调度系统 |
-
2005
- 2005-12-31 CN CN 200510048875 patent/CN1815448A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101957751A (zh) * | 2010-06-04 | 2011-01-26 | 福建星网锐捷网络有限公司 | 一种状态机的实现方法及装置 |
CN102591713A (zh) * | 2011-12-31 | 2012-07-18 | 浙江大学 | 基于有限状态机的软件功能模块的调度系统 |
CN102591713B (zh) * | 2011-12-31 | 2013-12-18 | 浙江大学 | 基于有限状态机的软件功能模块的调度系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1146820C (zh) | 数据库管理系统的动态修改 | |
CN1655118A (zh) | 处理器和编译器 | |
CN1290007C (zh) | 实现可移植内容保护以保护机密安全 | |
CN101055532A (zh) | 对并行计算机执行全局收集操作的方法及其并行计算机 | |
CN1121014C (zh) | 具有risc结构的八位微控制器 | |
CN1250906A (zh) | 使用组合的数据处理器系统和指令系统 | |
CN1991768A (zh) | 与不同种类的资源通信的基于指令系统结构的内定序器 | |
CN1881140A (zh) | 多核处理器的处理器模式自动控制装置及其方法 | |
CN1653446A (zh) | 具有可配置执行单元的高性能混合处理器 | |
CN101055535A (zh) | 并行计算机和定位并行计算机中硬件故障的方法 | |
CN1763717A (zh) | 一种利用脚本及其编译器调用宿主软件函数的系统与方法 | |
CN1567301A (zh) | 访问数据库的方法及装置 | |
CN1324432C (zh) | 降低处理器电力消耗的系统、方法及装置 | |
CN1949221A (zh) | 存储元素的方法与系统及查找元素的方法与系统 | |
CN1788251A (zh) | 处理安全消息认证控制指令 | |
CN1815448A (zh) | 一种高效易维护有限状态机的实现方法 | |
CN1949184A (zh) | 一种芯片验证的方法及系统 | |
CN1855052A (zh) | 一种从树型结构数据和一组代码片断结构体生成目标源代码的方法 | |
CN1245685C (zh) | 基于构件的操作系统动态设备驱动的方法 | |
CN1194300C (zh) | 一种面向路径的测试数据自动生成方法 | |
CN1234058C (zh) | 具有低功率译码电路的处理器 | |
CN1203402C (zh) | 一种16位微处理器的系统结构 | |
CN101056312A (zh) | 一种设备间通信的方法及系统 | |
CN1206145A (zh) | 带有流水线处理电路的信号处理器及其方法 | |
CN1100292C (zh) | 指令控制替换方法及其装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |