Есть ли способ генерировать абстрактное синтаксическое дерево исходного кода Java с использованием Python? - PullRequest
0 голосов
/ 31 мая 2019

В настоящее время у меня есть файлы JavaLexer.py и JavaParser.py, сгенерированные ANTLR. Моя цель заключается в следующем: во-первых, я хочу создать деревья абстрактного синтаксиса для кодов Java. После генерации этих AST я хочу обнаружить сходство кода между различными кодами Java, используя метрику расстояния редактирования. Для этого я решил использовать ANTLR 4.7.2 с Python 3.6.

Прямо сейчас я могу разобрать и получить что-то под названием compilationUnit (), используя JavaParser.py. Код для этого ниже:

source = open(path, "r", encoding="utf-8")
input_stream = InputStream(source.read())
lexer = JavaLexer(input_stream)
token_stream = CommonTokenStream(lexer)

parser = JavaParser(token_stream)
tree = parser.compilationUnit()
print(tree.toStringTree(recog=parser))

Вывод выглядит так:

(compilationUnit (typeDeclaration (classOrInterfaceModifier public) (classDeclaration class HelloWorld (classBody { (classBodyDeclaration (modifier (classOrInterfaceModifier public)) (modifier (classOrInterfaceModifier static)) (memberDeclaration (methodDeclaration (typeTypeOrVoid void) main (formalParameters ( (formalParameterList (formalParameter (typeType (classOrInterfaceType String) [ ]) (variableDeclaratorId args))) )) (methodBody (block { (blockStatement (statement (expression (expression (expression (primary System)) . out) . (methodCall println ( (expressionList (expression (primary (literal "HelloWorld")))) ))) ;)) }))))) }))) <EOF>)

Вопрос в том, что при текущей настройке, которую я использую, возможно ли преобразовать этот вывод в древовидную структуру?

...