Генерация деревьев разбора Java-кода и оценка его для тестирования - PullRequest
11 голосов
/ 16 сентября 2009

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

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

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

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

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

DMS Software Reengineering Toolkit - это тоже программа анализа / преобразования, которая работает со многими языками. Он имеет полный внешний интерфейс Java , включая синтаксический анализ, построение AST, построение таблицы символов и разрешение имен, разрешение типов, создание графиков вызовов (необходимых для разрешения вызовов виртуальных функций), а также средство чтения файлов .class для загрузки с разрешением имени. Так что это было бы хорошим основанием для создания переводчика.

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

[Причина существования DMS - это «сильно разочарованная» часть].

2 голосов
/ 16 сентября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...