2016-08-16 2 views
2

Я попытался использовать модуль Javalang, доступный в python, чтобы получить исходный код AST для Java, но для создания AST требуется целый класс. Передача блока кода, такого как оператор «if», вызывает ошибку. Есть ли другой способ сделать это? PS: Я предпочитаю использовать модуль python для выполнения задачи. ThanksЕсть ли способ получить AST (абстрактное синтаксическое дерево) блока кода в Java, а не всего класса?

+0

«но это требует целого класса для генерации AST» Я думал, что это следует ожидать, так как сам Java требует, чтобы каждый кусок кода, чтобы быть внутри класс? – DeepSpace

+0

Более конкретно, я хочу сравнить в двух фрагментах кода, является ли это просто рефакторинг другого или есть некоторые логические изменения? Так что, хотя я сравниваю их АСТ –

+0

Если вы не настаиваете на решении Python, у меня есть практический ответ. –

ответ

0

ОП заинтересован в ответе, отличном от Python.

Наш DMS Software Reengineering Toolkit с его Java Front End может выполнить это.

DMS - это инструмент общего назначения для анализа/анализа/преобразования кода, параметризованный определениями langauge (включая грамматики). Учитывая определение langauge, DMS можно легко вызвать в исходном файле/потоке, представляющем символ цели для грамматики, вызывая метод Parse, предложенный параметром langauge, а DMS будет строить дерево для проанализированной строки. Специальная поддержка предоставляется для синтаксического анализа исходного файла/потоков для произвольных нетерминалов, как определено грамматикой языка; DMS построит AST, корень которого является нетерминальным, разобрав источник в соответствии с подграмой, определите этим нетерминалом.

После того, как у вас есть AST, DMS обеспечивает большую поддержку для посещения AST, проверки/модификации узлов, выполнения преобразований источника в источник в AST с использованием правил перезаписи синтаксиса. Наконец, вы можете отпечатать модифицированный AST и вернуть действительный исходный код. (Если вы только разобрали фрагмент кода для нетерминала, то вы вернетесь - это действительный код для этого нетерминала).

Если OP желает сравнить полные файлы вместо фрагментов, наш Smart Differencer может быть полезен из коробки. SmartDifferencer создает АСТ двух своих входных файлов, находит наименьший набор концептуальных изменений (вставлять, удалять, перемещать, копировать, переименовывать) по структурированным элементам кода, что объясняет различия и сообщает о различиях.

0

Javalang может анализировать фрагменты Java кода:

>>> tokens = javalang.tokenizer.tokenize('System.out.println("Hello " + "world");') 
>>> parser = javalang.parser.Parser(tokens) 
>>> parser.parse_expression() 
MethodInvocation 
Смежные вопросы