В настоящее время я анализирую исходный код Java. Я проанализировал AST с помощью API-интерфейса Compiler Tree для анализа исходного кода. Но у меня есть проблема с добавлением нового узла AST (например, вставьте выражение или оператор) в блок компиляции, который позже может быть скомпилирован компилятором Java. Я не нашел ни одного метода или класса, которые могли бы сделать этот трюк.
Я не думаю, что компилятор Java разработан, чтобы вы могли восстановить исходный код из AST. В конце концов, в этом нет необходимости.
Если вы хотите изменить программы, вы можете рассмотреть возможность использования системы преобразования программ в исходное состояние (PTS). Это инструменты, которые анализируют исходный код (создание АСТ), позволяют использовать правила преобразования источника-источника, написанные в синтаксисе проанализированного исходного кода, вносить изменения в АСТ и могут восстанавливать исходный текст из АСТ.
Правила PTS в основном говорят: "Если вы видите это, замените его на это". Пример для нашей PTS (DMS Software Reengineering Toolkit):
rule convert_square_to_multiply:(b: primitive_expression):product -> product
= " \b ** 2 " -> " \b * \b "
if no_side_effects(b);
Это правило находит выражение, поднятое до мощности 2, и применяет классическое компилятор "снижение силы", чтобы сделать его более дешевым для оценки. Обратите внимание на дополнительное семантическое ограничение проверки на b; ваш PTS должен быть в состоянии помочь вам реализовать такие "анализы".
Правило работает:
Красота всего этого - манипуляция АСТ без написания сложного процедурного кода, чтобы взбираться вверх и вниз по дереву, проверять типы узлов, вставлять и вставлять узлы и т.д. Источником перезаписи исходного кода намного проще писать, проверять и поддерживать.
Если вы не можете использовать PTS, вы можете подумать о создании своего собственного шаблона; см. мой ответ SO о том, как это сделать. Я сомневаюсь, что компилятор Java фиксирует достаточно информации для восстановления "красивого" исходного кода; ему может быть достаточно, чтобы восстановить компилируемый исходный код. В качестве примера я вполне уверен, что компилятор Java AST не сохраняет комментарии; следовательно, их очень сложно восстановить. Стандартный PTS захватывает и воспроизводит все это.