Я пытаюсь найти обобщенный способ преобразовать сопрограмму, написанную на таком языке, как go, python или javascript, в конечный автомат (FSM). Мне это нужно для того, чтобы объединить несколько конечных автоматов в один большой, потому что людям, как правило, легче следовать цепочке инструкций, чем перепрыгивать через переходы. Они показывают эквивалентные примеры для обоих, но не имеют возможности переводить между ними:
http://eli.thegreenplace.net/2009/08/29/co-routines-as-an-alternative-to-state-machines/
http://www.crystalclearsoftware.com/soc/coroutine/coroutine/finite_state_machines.html
Пока что ближайшая вещь, которую я нашел, - это Ragel, но он, похоже, преобразует только серию регулярных выражений. в FSM, аналогично тому, как работают lex или yacc.
Если нет существующего инструмента для этого с сопрограммами, есть ли он для генераторов? Возможно, они создают внутренние автоматы, которые я мог бы использовать:
http://almostobsolete.net/coffeescript-generators.html
https://www.npmjs.org/package/regenerator
Или кто-то знает общую стратегию прохождения сопрограммы, отслеживания результатов и создания дерева вызовов, которое можно преобразовать в FSM с помощью goto или команды switch? Ничего страшного, если это работает только на подмножестве языка, например, без структур, вызовов функций или включений, что заставляет меня задаться вопросом, будет ли работать вывод синтаксического анализатора.
Я также хотел бы иметь возможность сделать обратное - преобразовать автомат в сопрограмму, но это не так критично.
Обновление: это появилось в боковых ссылках после того, как я разместил это. Акторы имеют сходство с сопрограммами, поэтому, возможно, можно преобразовать сопрограммы для акторов в конечные автоматы: Конечный автомат и сигнализация между автоматами