Рассмотрите возможность создания конечного автомата, управляемого таблицами. Если вы думаете об определении конечного автомата, у вас есть в основном набор состояний с выделенным начальным состоянием, функция перехода и (в этом случае) вход и выход алфавит.
Вы можете создать таблицу, индексированную по текущему состоянию и входу, и использовать указатель на функцию или класс функтора, чтобы представить, что происходит. Эта функция должна вернуть следующее состояние. Затем вы можете построить конечный автомат как (псевдокод):
state := initial state
while(state != STOP)
state := (lookupTransition(inputs))()
, где lookupTransition(inputs)
просто находит следующее состояние. Здесь я предполагаю, что функции перехода являются функциями без аргументов, возвращающих состояние, поэтому lookupTransition(inputs)
должен быть функцией от любого количества входных данных, возвращающих указатель на функцию пустых аргументов, возвращающих состояние.
Установите это правильно, и вы можете поместить весь конечный автомат и поведение в одну таблицу, которую можно легко изменить и перекомпилировать.
(Для дополнительной информации выясните, как можно загрузить эту таблицу из файла, чтобы вам вообще не нужно было перекомпилировать.)
Обновление
В Java вместо указателей на функции используйте что-то вроде класса функтора.
Другое обновление
Конечно, другой вариант - использовать компилятор конечного автомата, например Ragel .