Подтвердить что ты не робот

Как генерировать AST из исходного кода Java?

Насколько я знаю, единственный способ разобрать исходный код Java в AST (абстрактное синтаксическое дерево) - это использовать API Java Compiler Tree: com.sun.source.tree

У меня есть два вопроса:

  • Какие JDK поддерживают com.sun.source.tree?
  • Есть ли переносная замена, которая работает для всех JDK?
4b9b3361

Ответ 1

Вы можете взять tools.jar и использовать его. javac - это с открытым исходным кодом, поэтому вы можете просто захватить этот код (при условии, что вы можете иметь дело с лицензией). Antlr имеет также грамматики для Java.

Ответ 2

Что касается вашего второго вопроса, в дополнение к Sun есть десятки парсеров Java. Вот небольшой пример:

  • Eclipse org.eclipse.jdt.core.dom пакет.
  • Spoon выводит очень красивое аннотированное дерево разбора с информацией о типе и привязкой переменной (и использует парсер Eclipse внутри)
  • ANTLR является синтаксическим анализатором, но существуют доступные грамматики для Java
  • javaparser (который я не использовал)

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

Ответ 3

Я использовал парсер Eclipse AST. Я нашел, что это довольно хорошо (хорошо, что это было частью плагина Eclipse, поэтому имеет смысл использовать его). См. Изучение Eclipse ASTParser.

Ответ 4

Рабочий, простой в использовании Java Parser - это... JavaParser. Проект уже несколько лет работает. Хотя он был первоначально размещен в коде Google, теперь он доступен в GitHub: https://github.com/javaparser/javaparser

Это довольно просто использовать, а количество зависимостей невелико. Он также доступен на Maven.

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

Ответ 5

Это не единственный способ.

Смотрите наш Java Front End, который является полнофункциональным Java-парсером, построенным поверх DMS Software Reengineering Toolkit. Он анализирует Java и строит АСТ как внутренние структуры данных.

Точка DMS заключается в том, что она предоставляет огромное количество дополнительных полезных машин (атрибут-грамматики, таблицы символов, анализ потоков, манипуляции с АСТ, включая доступ и обновление, а также преобразования источника-источника) для анализа и преобразования этого AST в результаты и/или модифицированный исходный код. Если вы получите "просто" парсер Java (например, JavaCC + Java grammar), вы, ИМХО, не сможете много делать с ним. DMS позволяет делать много, без необходимости самостоятельно изобретать все эти дополнительные механизмы.

Если вы действительно не хотите использовать дополнительное оборудование DMS, оно будет сбрасывать дерево как XML.