Преобразовать сопрограмму в конечный автомат (FSM) и наоборот?

Я пытаюсь найти обобщенный способ преобразовать сопрограмму, написанную на таком языке, как 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? Ничего страшного, если это работает только на подмножестве языка, например, без структур, вызовов функций или включений, что заставляет меня задаться вопросом, будет ли работать вывод синтаксического анализатора.

Я также хотел бы иметь возможность сделать обратное - преобразовать автомат в сопрограмму, но это не так критично.

Обновление: это появилось в боковых ссылках после того, как я разместил это. Акторы имеют сходство с сопрограммами, поэтому, возможно, можно преобразовать сопрограммы для акторов в конечные автоматы: Конечный автомат и сигнализация между автоматами


person Zack Morris    schedule 11.02.2014    source источник
comment
Привет, мой код генераторов Coffeescript вам не поможет, это просто синтаксис (он полагается на поддерживающие генераторы цели JavaScript). Ознакомьтесь с Traceur Compiler от Google, чтобы увидеть пример преобразования генераторов JavaScript ES6 в FSM для поддержки ES5: github.com/google / traceur-compiler   -  person Thomas Parslow    schedule 25.03.2014