【问题标题】:What's the best way of implementing a finite state machine in C++在 C++ 中实现有限状态机的最佳方法是什么
【发布时间】:2015-05-17 05:17:41
【问题描述】:

我已经看到了许多不同的方法来实现 FSM。

开关盒 函数指针表 面向对象编程

我的问题是,在选择一种实现方式而不是另一种实现方式时,我应该注意哪些主要因素。在我的情况下,我只有 4 个状态,每个状态最多有 2 个转换。我的主要目标是让实现易于阅读,其他人可以修改。

谢谢

【问题讨论】:

  • 看看 boost msm。您还可以在他们的文档中看到优缺点。在你描述的这个非常简单的状态机中,这可能有点过头了,但 msm 将提供一个非常易读的转换表
  • 我猜你可以考虑的一件事是为 FSM 使用升压灵气解析器?既然你说你的 FSM 很小——如果它很自然地对应于正则表达式,并且你认为这比编写转换表更简单,那么以语法形式(使用语义动作?)可能值得考虑。如果您在大学学习过计算理论,那么您可能在某个时候了解到 FSM 和(简单)正则表达式在形式上是等价的(但不是像 perl 和 grep 中使用的超级正则表达式)

标签: c++ fsm state-machine


【解决方案1】:

请查看method-based FSA 实施

// abstract FSA
template<class C, typename T>
struct fsa {
    struct state_t {
        typedef state_t (C::*type)(T);
        inline state_t(type f) : state(f) {}
        type state;
    };

    fsa(state_t init) : state(init) {}

    inline bool next(T val) {
        state = (static_cast<C*>(this)->*state.state)(val);
        return state.state != nullptr;
    }
private:
    state_t state;
};

//concrete FSA implementation
struct myfsa : fsa<myfsa,char> {
    inline myfsa() : fsa<myfsa, char>(&myfsa::start) {}
    state_t start(char) {
        std::cout << "start" << std::endl;
        return &myfsa::state1;
    }
    state_t state1(char) {
        std::cout << "state1" << std::endl;
        return &myfsa::state2;
    }
    state_t state2(char) {
        std::cout << "state2" << std::endl;
        return nullptr;
    }
    char get() { return ' '; /*TODO*/ }
    void run() {
        while(next(get()));
    }
};

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 2021-07-02
    • 2013-08-10
    • 2011-06-03
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多