В настоящее время у меня есть файлы 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>)
Вопрос в том, что при текущей настройке, которую я использую, возможно ли преобразовать этот вывод в древовидную структуру?