Есть ли решение для переноса меток 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.)

Надеюсь, этого достаточно, чтобы все заработало, удачи!

Другие вопросы по тегам