Search
Write a publication
Pull to refresh

Comments 7

Вы можете легко расширить список, если хотите

Я считаю, что со стейт машинами все же немного поаккуратнее надо быть. Если условно к Коту Ваське, добавить еще Пса Шарика, а так же применить некую функцию от их взаимных отношений. То для вычисления состояния такой системы, желательно уже обладать представлением о нормальных формах булевых функций, картах Карно и прочих методах оптимизации. Там нет ничего сложного, но думаю не многие предпочитают углубляться.

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

Но даже и плоские структуры, как в Ваших примерах, могут тоже очень неприятно разрастаться, если их не нормировать, проверено на личном опыте. Поэтому сейчас считаю, что при использовании подобной техники, очень желательно обладать неким запасом теории в этой сфере. И тогда действительно это может оказаться полезным инструментом.

Скажите, пожалуйста, где вы делали блок-схемы.

Напомню, что существует замечательный Graphviz, в который очень удобно скармливать сгенерированные состояния и переходы для их визуализации. Исходный текст обычно создаю с помощью простейшего SQL-запроса, если таблица состояний и переходов лежит в базе. Сгенерированный SVG потом при желании можно доработать напильником для красоты. Есть веб-песочницы (раз, два), чтобы попробовать синтаксис.

UFO landed and left these words here

Во втором листинге, где создаётся объект fsm и указаны возможные переходы, ошибка
Описанию

Если текущее состояние — q0, а текущий символ — 0 или 1, выполнить переход в состояние q1.
Если текущее состояние — q1, а текущий символ — 0 или 1, выполнить переход в то же состояние.

Соответствует следующая таблица переходов:

  q0: {
    0: 'q1',
    1: 'q1'
  },
  q1: {
    0: 'q1',
    1: 'q1'
  }

Т.к. в оригинальном листинге даже при следующем символе из алфавита при стартовом состоянии q0 мы из состояния q0 мы можем перейти только в q0

Действительно, спасибо, что подсветил. Поправил статью и кодпен)

Sign up to leave a comment.