Есть ли решение для переноса меток Lua в ECMAScript3?
Я перестраиваю транспортер Lua на ES3 (инструмент для преобразования Lua в кросс-браузерный JavaScript). Прежде чем я начну тратить свои идеи на этот транспортер, я хочу спросить, возможно ли преобразовать метки Lua в ECMAScript 3. Например:
goto label;
:: label ::
print "skipped";
Моя первая идея состояла в том, чтобы разделить каждое тело операторов по частям, например, когда есть метка, следующие операторы должны быть сохранены как целая следующая часть:
some body
label (& statements)
other label (& statements)
и так далее. Каждое утверждение, которое имеет тело (или фрагмент программы), получает список таких частей. Каждая часть метки должна иметь свое имя, хранящееся где-то (например, в своем собственном объекте части, внутри свойства).
Каждая часть будет функцией или будет хранить функцию на себе, которая будет выполняться последовательно по отношению к другим.
Оператор goto будет искать свою специальную метку, чтобы выполнить свою инструкцию, и вызывать инструкцию возврата ES, чтобы остановить выполнение текущей инструкции.
Ограничение разделения операторов body таким способом заключается в доступе к переменным и функциям, определенным в разных частях... Итак, есть идея или ответ для этого? Разве невозможно иметь стабильные метки, если конвертировать их в ECMAScript?
1 ответ
Я не совсем понимаю вашу идею, но, похоже, кто-то уже решил проблему: JavaScript позволяет continue
с которой в сочетании с манекеном while
петли, разрешить эмуляцию goto
в функции. (И если я что-то забыл, это должно быть все, что вам нужно для Луа.)
Сравните страницы 72-74 спецификации ECMAScript. № 3 от 2000-03-24, чтобы увидеть, что он должен работать в ES3, или просто посмотреть, например, на этот ответ на вопрос о goto в JS. Как обычно в сети, URL-адреса, на которые есть ссылки, мертвы, но вы можете получить summerofgoto.com [в архиве] в потрясающем интернет-архиве. (Исходящая ссылка на GitHub также не работает, но сценарии также архивируются: parseScripts.js, goto.min.js или goto.js.)
Надеюсь, этого достаточно, чтобы все заработало, удачи!