如何实现FSM(编辑:有限状态机)状态?我通常会想到一个FSM,比如一组函数、一个调度程序和一个线程来指示当前的运行状态。也就是说,我会阻止对表示状态的函数/函子的调用。
刚才我已经用不同的方式实现了一个,我仍然用函数(对象)表示状态,但是线程只是调用一个state->step()方法,该方法试图尽快返回。如果状态已经完成,并且应该进行过渡,则表示相应地。我将其称为“轮询”风格,因为这些函数主要是这样的:
void step()
{
if(!HaveReachedGoal)
{
doWhateverNecessary();
return; // get out as fast as possible
}
// ... test perhaps some more subgoals
indicateTransition();
}我知道这是密克罗尼西亚联邦内部的一个密克罗尼西亚联邦。
这感觉相当简单,但也有一定的优势。虽然被阻塞的线程,或者在某种类型的while (!CanGoForward)checkGoForward();循环中持有的线程可能很麻烦和难以处理,但是轮询更容易调试。这是因为FSM对象在每一步之后都恢复控制,并且发布一些调试信息是很容易的。
那么,我偏离了我的问题:如何实现FSM的状态?
发布于 2010-06-21 11:33:08
状态设计模式是实现FSM的一种有趣的方法:
模式
这是实现FSM的一种非常干净的方式,但它可能会很混乱,取决于FSM的复杂性(而不是状态的数量)。然而,其优点是:
在这个站点上有一个Java和C++实现:
http://www.vincehuston.org/dp/state.html
发布于 2010-06-21 11:28:17
我总是把飞天派怪物的实现FSMs (FSM风格FSM)的风格称为:使用lotsa gotos。例如:
state1:
do_something();
goto state2;
state2:
if (condition) goto state1;
else goto state3;
state3:
accept;非常好的意大利面代码:-)
发布于 2010-06-21 11:28:22
我把它作为一个表,内存中的一个平面数组,每个单元格都是一个状态。请看一看废弃的DFA项目的cvs源。对于示例
class DFA {
DFA();
DFA(int mychar_groups,int mycharmap[256],int myi_state);
~DFA();
void add_trans(unsigned int from,char sym,unsigned int to);
void add_trans(unsigned int from,unsigned int symn,unsigned int to);
/*adds a transition between state from to state to*/
int add_state(bool accepting=false);
int to(int state, int symn);
int to(int state, char sym);
void set_char(char used_chars[],int);
void set_char(set<char> char_set);
vector<int > table; /*contains the table of the dfa itself*/
void normalize();
vector<unsigned int> char_map;
unsigned int char_groups; /*number of characters the DFA uses,
char_groups=0 means 1 character group is used*/
unsigned int i_state; /*initial state of the DFA*/
void switch_table_state(int first,int sec);
unsigned int num_states;
set<int > accepting_states;
};但是这是为了一个非常特殊的需求(匹配正则表达式)。
https://stackoverflow.com/questions/3084157
复制相似问题