Не думаю, что ваша задача проста или коротка, если вы хотите получить доступ и восстановить все состояние программы.Одна из проблем заключается в том, что вам может потребоваться зафиксировать состояние программы в любой момент во время вычислений, верно?Это означает, что приведенный пример не совсем верен;он фиксирует состояние перед выполнением этого кода (за исключением того, что вы предварительно вычислили сумму, которая инициализирует магию, и этого не произойдет, пока код не будет запущен для исходного JavaScript).Я предполагаю, что вы, возможно, захотите захватить состояние в любой момент во время выполнения.
То, как вы заявили о своей проблеме, это то, что вы хотите парсер JavaScript в JavaScript.Я предполагаю, что вы представляете, что ваш существующий JavaScript-код J включает в себя такой синтаксический анализатор JavaScript и все остальное, что необходимо для генерации результирующего кода G, и что при запуске J он передает свои копии в G, производя код сериализации S и каким-то образомзагружая это.(Я думаю, что G довольно большой и седой, если он может обрабатывать весь Javascript). Таким образом, ваше изображение JavaScript содержит J, большие G, S и выполняет дорогостоящую операцию (подача J в G) при запуске.
Я думаю, что вам лучше пригодится инструмент G, который обрабатывает ваш исходный код JavaScript J в автономном режиме и генерирует код сериализации состояния / закрытия программы S (для сохранения и восстановления этого состояния), который можно добавить в / заменитьJ для исполнения.J + S отправляются клиенту, который никогда не видит G или его выполнение.Это отделяет генерацию S от выполнения J времени выполнения, экономя время и пространство выполнения клиента.
В этом случае вам нужен инструмент, который сделает генерацию такого кода S проще всего.Парсер чистого JavaScript - это начало, но этого недостаточно;вам понадобится поддержка таблицы символов, чтобы узнать, к какому коду функции подключен вызов функции F (...) и какое определение переменной в какой области соответствует присваиванию или доступу к переменной V. Возможно, вам потребуется изменить исходный код.J для вставки точек доступа, где может быть зафиксировано состояние программы.Вам может понадобиться анализ потока, чтобы выяснить, куда пошли некоторые значения.Настаивая на том, что все это в JavaScript, вы сужаете диапазон своих решений.
Для этих задач вам, скорее всего, пригодится инструмент преобразования программ .Такие инструменты содержат синтаксические анализаторы для интересующего языка, создают AST, представляющие программу, позволяют создавать карты идентификатора-определения («таблицы символов»), могут выполнять модификации AST, представляющие вставку точек доступа, или синтез AST.представляющий ваш демонстрационный пример, а затем заново сгенерированный действительный код JavaScript, содержащий измененный J и дополнения S. Из всех известных мне систем преобразования программ (включая все те, которые есть на сайте Википедии) ни одна не реализована в JavaScript.
Наш инструментарий реинжиниринга программного обеспечения DMS - это такая система преобразования программ, предлагающая все функции, которые я только что описал.(Да, он большой и седой; он должен справляться со сложностями реальных компьютерных языков).Он имеет интерфейс JavaScript , который содержит полный синтаксический анализатор JavaScript для AST и механизм восстановления кода JavaScript из модифицированных или синтезированных AST.(Также большой и седой; хорошо, что седой + седой все еще просто седой).Если это будет полезно, DMS также предоставляет поддержку для управления зданием и анализа потока данных.