Какой лучший способ реализации конечного автомата в С++

101
7

Я видел несколько разных подходов к внедрению FSM.

Перестановочный ящик Таблицы указателей функций объектно-ориентированного программирования

Мой вопрос в том, каковы основные факторы, о которых я должен знать при выборе одной реализации над другой. В моем случае у меня только 4 состояния с не более чем 2 переходами в каждом состоянии. Моя основная цель заключается в том, чтобы эта реализация была легко читаемой для кого-то другого.

благодаря

спросил(а) 2015-05-17T08:17:00+03:00 5 лет, 1 месяц назад
1
Решение
76

Пожалуйста, взгляните на метод 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()));
}
};

ответил(а) 2015-08-20T08:18:00+03:00 4 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема