Ответ 1
Вы можете взять tools.jar и использовать его. javac - это с открытым исходным кодом, поэтому вы можете просто захватить этот код (при условии, что вы можете иметь дело с лицензией). Antlr имеет также грамматики для Java.
Насколько я знаю, единственный способ разобрать исходный код Java в AST (абстрактное синтаксическое дерево) - это использовать API Java Compiler Tree: com.sun.source.tree
У меня есть два вопроса:
Вы можете взять tools.jar и использовать его. javac - это с открытым исходным кодом, поэтому вы можете просто захватить этот код (при условии, что вы можете иметь дело с лицензией). Antlr имеет также грамматики для Java.
Что касается вашего второго вопроса, в дополнение к Sun есть десятки парсеров Java. Вот небольшой пример:
Мой лучший совет - попробовать каждый из них, чтобы посмотреть, какие из них лучше всего подходят для ваших нужд.
Я использовал парсер Eclipse AST. Я нашел, что это довольно хорошо (хорошо, что это было частью плагина Eclipse, поэтому имеет смысл использовать его). См. Изучение Eclipse ASTParser.
Рабочий, простой в использовании Java Parser - это... JavaParser. Проект уже несколько лет работает. Хотя он был первоначально размещен в коде Google, теперь он доступен в GitHub: https://github.com/javaparser/javaparser
Это довольно просто использовать, а количество зависимостей невелико. Он также доступен на Maven.
Он используется в течение нескольких лет, поэтому он работает достаточно хорошо и позволяет анализировать также комментарии, изменять AST и восстанавливать код.
Это не единственный способ.
Смотрите наш Java Front End, который является полнофункциональным Java-парсером, построенным поверх DMS Software Reengineering Toolkit. Он анализирует Java и строит АСТ как внутренние структуры данных.
Точка DMS заключается в том, что она предоставляет огромное количество дополнительных полезных машин (атрибут-грамматики, таблицы символов, анализ потоков, манипуляции с АСТ, включая доступ и обновление, а также преобразования источника-источника) для анализа и преобразования этого AST в результаты и/или модифицированный исходный код. Если вы получите "просто" парсер Java (например, JavaCC + Java grammar), вы, ИМХО, не сможете много делать с ним. DMS позволяет делать много, без необходимости самостоятельно изобретать все эти дополнительные механизмы.
Если вы действительно не хотите использовать дополнительное оборудование DMS, оно будет сбрасывать дерево как XML.
Я только что встретил Jexast, извлечение JDT ASTParser в работать независимо от Eclipse (это зависит от org.eclipse.jdt.internal.compiler.**
).
Я еще не пробовал, но это кажется интересным.