Генерация JavaScript из дерева разбора JSLINT - PullRequest
6 голосов
/ 04 февраля 2012

С помощью JSLINT Крокфорда, после вызова JSLINT() для анализа какого-либо источника JavaScript, он предоставляет доступ к дереву разбора через JSLINT.tree

Было бы очень полезно иметь возможность анализировать дерево, вносить в него структурные изменения на основе анализа, а затем генерировать новый JavaScript из модифицированного дерева.

Существует ли проект с открытым исходным кодом, основанный на JSLINT, обеспечивающий преобразование дерева разбора обратно в JavaScript?

(Возможно ли это, т. Е. Поддерживает ли JSLINT достаточно полную информацию от разбора, чтобы обойти все существенное?)

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Я не знаю, сможет ли это сделать JSLint (глядя на некоторые сообщения на форуме, не похоже, что поддержание дерева является их целью, а побочным продуктом для процесса линтинга).

uglifyjs Проект может помочь с генерацией AST из javascript и повторным преобразованием AST в код.См. этот метод для AST в javascript.

1 голос
/ 04 февраля 2012

Не с открытым исходным кодом, но выполняет именно то, что запрашивает OP: наш Клиентский интерфейс JavaScript .

Этот интерфейс основан на нашем DMS Software Reengineering Toolkit , который представляет собой настраиваемую технологию компиляции общего назначения, полезную для построения произвольных анализаторов кода и преобразователей. DMS имеет много внешних интерфейсов, доступных для многих языков (COBOL, Java, C ++, ...)

В частности, синтаксические анализаторы на основе DMS (включая JavaScript) собирают полную информацию для восстановления исходного дерева, включая информацию о начале и конце столбцов для токенов, количество числовых литералов, различия в соглашениях о цитировании строк и т. Д. включите его, чтобы сделать печать верности, где никакие преобразования не были применены. DMS также предоставляет множество других полезных сервисов для обработки дерева, таких как посетители, поддержка построения таблицы символов, поддержка анализа потока, сопоставление с образцом, а также преобразования от источника к источнику.

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

Мы сделали это, потому что, как сказал Даниил, «возможности безграничны». Он приводит пример инструментирования кода для отслеживания сбоев во время выполнения; этот вид инструментовки является очень полезной идеей, и мы создаем инструменты покрытия тестами, основанные именно на этой мысли.

...