1

I have two codes and I would like to be able to see their identical syntax with antlr

String s1 = "public class Test { public static int add (int i, int j) { int g = i + j; return g;}}";
String s2 = "public class Essai { public static int add (int nb1, int nb2) {int nb3 = nb1 + nb2; return nb3;}}";

I transform the string into a tree via antlr

public static Java8Parser.CompilationUnitContext getTree(String s) {
        CharStream cs = CharStreams.fromString(s);
        antlr4.Java8Lexer java8Lexer = new antlr4.Java8Lexer (cs);
        CommonTokenStream commonTokenStream = new CommonTokenStream(java8Lexer);
        antlr4.Java8Parser java8Parser = new antlr4.Java8Parser (commonTokenStream);
        Java8Parser.CompilationUnitContext tree = java8Parser.compilationUnit();
        System.out.println(tree.toStringTree(java8Parser));
        return tree;
    }

And I get two similar trees but of course not quite the same

(compilationUnit (typeDeclaration (classDeclaration (normalClassDeclaration (classModifier public) 
class Test (classBody { (classBodyDeclaration (classMemberDeclaration (methodDeclaration (methodModifier public) (methodModifier static) (methodHeader (result (unannType (unannPrimitiveType (numericType (integralType int))))) 
(methodDeclarator add ( (formalParameterList (formalParameters (formalParameter (unannType (unannPrimitiveType (numericType (integralType int)))) (variableDeclaratorId i))) , (lastFormalParameter (formalParameter (unannType (unannPrimitiveType (numericType (integralType int)))) (variableDeclaratorId j)))) ))) 
(methodBody (block { (blockStatements (blockStatement (localVariableDeclarationStatement (localVariableDeclaration (unannType (unannPrimitiveType (numericType (integralType int)))) (variableDeclaratorList (variableDeclarator (variableDeclaratorId g) = (variableInitializer (expression (assignmentExpression (conditionalExpression (conditionalOrExpression (conditionalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (additiveExpression (multiplicativeExpression (unaryExpression (unaryExpressionNotPlusMinus (postfixExpression (expressionName i)))))) + (multiplicativeExpression (unaryExpression (unaryExpressionNotPlusMinus (postfixExpression (expressionName j))))))))))))))))))))) ;)) 
(blockStatement (statement (statementWithoutTrailingSubstatement (returnStatement return (expression (assignmentExpression (conditionalExpression (conditionalOrExpression (conditionalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (multiplicativeExpression (unaryExpression (unaryExpressionNotPlusMinus (postfixExpression (expressionName g))))))))))))))))) ;))))) }))))) })))) <EOF>)

and

(compilationUnit (typeDeclaration (classDeclaration (normalClassDeclaration (classModifier public) 
class Essai (classBody { (classBodyDeclaration (classMemberDeclaration (methodDeclaration (methodModifier public) (methodModifier static) (methodHeader (result (unannType (unannPrimitiveType (numericType (integralType int))))) (methodDeclarator add ( (formalParameterList (formalParameters (formalParameter (unannType (unannPrimitiveType (numericType (integralType int)))) (variableDeclaratorId nb1))) , (lastFormalParameter (formalParameter (unannType (unannPrimitiveType (numericType (integralType int)))) (variableDeclaratorId nb2)))) ))) 
(methodBody (block { (blockStatements (blockStatement (localVariableDeclarationStatement (localVariableDeclaration (unannType (unannPrimitiveType (numericType (integralType int)))) (variableDeclaratorList (variableDeclarator (variableDeclaratorId nb3) = (variableInitializer (expression (assignmentExpression (conditionalExpression (conditionalOrExpression (conditionalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (additiveExpression (multiplicativeExpression (unaryExpression (unaryExpressionNotPlusMinus (postfixExpression (expressionName nb1)))))) + (multiplicativeExpression (unaryExpression (unaryExpressionNotPlusMinus (postfixExpression (expressionName nb2))))))))))))))))))))) ;)) 
(blockStatement (statement (statementWithoutTrailingSubstatement (returnStatement return (expression (assignmentExpression (conditionalExpression (conditionalOrExpression (conditionalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (multiplicativeExpression (unaryExpression (unaryExpressionNotPlusMinus (postfixExpression (expressionName nb3))))))))))))))))) ;))))) }))))) })))) <EOF>)

How can I compare the two codes and say other than different variable names they are the same?

Bart Kiers
  • 166,582
  • 36
  • 299
  • 288
  • 2
    Your question is not really about ANTLR. Rather it is asking how to compare two arbitrary trees and report the differences. Search for 'graph isomorphism' or 'tree comparison' to look for possible algorithms. – sprinter Jul 26 '21 at 00:53
  • 1
    A special case of Zhang Shasha? – kaby76 Jul 26 '21 at 04:27

0 Answers0