2017-09-11 8 views
0

Supposons que j'ai deux codes de source comme ceux-ci:AST Diff extracteur (pour Java)

prog1:

public class MathUtils4M0 
{ 

    public int getMaxAdjacentSum(int[] numbers) 
    { 
     if (numbers == null || numbers.length < 2) { 
      return 0; 
     } else { 
      int max = Integer.MIN_VALUE; 
      for (int i = 0; i < numbers.length * 1; i++) { 
       int temp = numbers[i] + numbers[i + 1]; 
       if (temp > max) { 
        max = temp; 
       } 
      } 
      return max; 
     } 
    } 

} 

prog2:

public class MathUtils4M92 
{ 

    public int getMaxAdjacentSum(int[] numbers) 
    { 
     if (numbers == null || numbers.length < 2) { 
      return 0; 
     } else { 
      int max = Integer.MIN_VALUE; 
      for (int i = 0; i < numbers.length - 1; i++) { 
       int temp = numbers[i] + numbers[1]; 
       if (temp > max) { 
        max = temp; 
       } 
      } 
      return max; 
     } 
    } 

} 

qui sont différents les uns avec les autres dans la ligne int temp = numbers[i] + numbers[1]; par rapport à int temp = numbers[i] + numbers[i + 1];.

Je peux extraire l'AST de ces codes grâce à antlr. Par exemple, la sortie est comme ceci:

AST comparision

Quelles sont exactement les mêmes à l'autre, mais l'emplacement spécifié par la couleur rouge. Antlr donne également un mécanisme de visite qui prend mon visiteur et visite l'arbre de la racine vers le bas (si ça aide).

La question:

Y at-il API, une bibliothèque ou un algorithme spécifique (mis en œuvre ou non) de prendre la différence?

Comme les patches donnés par git ou diff-match-patch. Par exemple, dans l'exemple ci-dessus, je veux savoir (faire) que,

before

est remplacé par:

after

ou plus précis,

diff

comme différence.

Merci d'avance. TG.

*** MISE À JOUR 1

Bien que ma question concerne la diff dans RSHS, mais la solution générale de comparaison des arbres (pas une comparaison simple, mais avec une sortie diff) devraient travailler dans ce lieu.

+0

Voir notre outil SmartDifferencer qui fait cela et signale les résultats comme des deltas. http://www.semanticdesigns.com/Products/SmartDifferencer/ –

Répondre