Создание деревьев синтаксического анализа кода java и его оценка для тестирования

нам необходимо создать исходный код Java. Мы делаем это, моделируя абстрактное синтаксическое дерево и имеем древовидный ходок, который генерирует фактический текст исходного кода. Это далеко все хорошо.

поскольку мой код AST немного устарел, он не поддерживает аннотации и дженерики. Поэтому я ищу открытые проекты для использования в будущих проектах с потребностями генерации кода. А это где собственно вопрос. Мы хотим проверить, что сгенерированный код имеет правильный поведение.

вот где я получил идею фактически оценить AST вместо генерации исходного кода java, скомпилировать его и запустить тесты против этого кода. Оценщик ускорит модульные тесты, и можно будет оценить меньшие части сгенерированного кода, такие как только метод, что делает "единицы" более разумными.

до сих пор я нашел com.солнце.проект codemodel, который кажется довольно приятным, поскольку он является современным (поддержка функций java5 и 6) на основе AST решение для генерации кода.

кто-нибудь знает, есть ли другой проект, который позволит мне напрямую оценивать части AST (например, один сгенерированный метод)?

2 ответов


чтобы оценить Java, вам нужен весь семантический анализ, который идет вместе с ним ("какова область этого идентификатора? Какой у него тип?") а также переводчика.

чтобы получить этот семантический анализ, вам нужно больше, чем просто AST: вам нужно разрешение полного имени (построение таблицы символов) и разрешение типа (определение типов выражений и проверка правильности выражений в контексте, в котором они найдены), а также поиск класса (какой фактический метод делает фу ссылаться?)

с этим вы можете рассмотреть возможность создания интерпретатора путем обхода деревьев в порядке выполнения. Вам также нужно будет создать менеджер хранилища; возможно, Вам не нужно будет делать полный сборщик мусора, но вам что-то понадобится. Вам также понадобится переводчик для.файлы классов, если вы действительно хотите запустить что-то, что означает, что вам нужен парсер (и разрешение имени/типа для файлов классов тоже).

Я не знаю, есть ли у Eclipse все это (по крайней мере, часть storage manager вы можете получить бесплатно :). Я бы ожидал этого, учитывая, что его оригинальный дизайн должен был поддерживать разработку Java, но я был очень разочарован множеством инструментов на протяжении многих лет.

на программное обеспечение DMS реинжиниринга инструментарий - это анализ/преобразование программы, которая обрабатывает многие языки. Он имеет полный Java front end включая парсинг, здание АСТ, конструкцию таблицы символа и разрешение имени, тип разрешения, строит графики вызовов (необходимые для разрешения вызовов виртуальных функций) и имеет .класс File reader для загрузки с разрешением имени. Так что это будет хорошей основой для создания переводчика.

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

[причина, по которой существует DMS, - это "очень разочарованная" часть].


Я не уверен, что это то, что вы ищете, но проект JDT Eclipse обеспечивает очень хорошее представление о Java AST (включая функции Java 5 и 6). Он имеет ряд утилит и инструментов для просмотра/перезаписи кода (не обязательно генерации). Все они имеют лицензию Eclipse Public License.

вы можете получить больше информации на http://eclipse.org/jdt/