Как использовать API дерева компиляторов Java (com.sun.source.util) для восстановления исходного кода

1

В настоящее время я анализирую исходный код Java. Я проанализировал AST с помощью API-интерфейса Compiler Tree для анализа исходного кода. Но у меня есть проблема с добавлением нового узла AST (например, вставьте выражение или оператор) в блок компиляции, который позже может быть скомпилирован компилятором Java. Я не нашел ни одного метода или класса, которые могли бы сделать этот трюк.

Теги:
abstract-syntax-tree
javaparser

1 ответ

1
Лучший ответ

Я не думаю, что компилятор 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 должен быть в состоянии помочь вам реализовать такие "анализы".

Правило работает:

  • сопоставляя AST для анализируемой исходной программы с AST, подразумеваемой шаблоном в левой части правила ("если вы видите это...")
  • при сопоставлении переменная шаблона ("b") привязывается к соответствующему поддереву
  • проверяя условие "если", чтобы убедиться, что это правда,
  • если это так, согласованное поддерево удаляется и заменяется деревом, форма которого подразумевается правой частью правила ("замените его на это")

Красота всего этого - манипуляция АСТ без написания сложного процедурного кода, чтобы взбираться вверх и вниз по дереву, проверять типы узлов, вставлять и вставлять узлы и т.д. Источником перезаписи исходного кода намного проще писать, проверять и поддерживать.

Если вы не можете использовать PTS, вы можете подумать о создании своего собственного шаблона; см. мой ответ SO о том, как это сделать. Я сомневаюсь, что компилятор Java фиксирует достаточно информации для восстановления "красивого" исходного кода; ему может быть достаточно, чтобы восстановить компилируемый исходный код. В качестве примера я вполне уверен, что компилятор Java AST не сохраняет комментарии; следовательно, их очень сложно восстановить. Стандартный PTS захватывает и воспроизводит все это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню