/** * la methode qui compare deux arbres et dit si ils match, appele par check * * @param pattern la partie gauche de la regle utilisee * @param arbre l'arbre dont on veut voir si il correspond a cette regle. * @param ht la hashmap qui va nous servir dans le remplacement. * @return on dit si les arbres match */ private boolean compareExpressions( Expression pattern, Expression arbre, Hashtable<Character, Expression> ht) { boolean check; int i; if (!pattern.getType().equals(arbre.getType())) { return false; } // si c'est une variable if (pattern.getType().contains("variable")) { // si ce sont des varianles on verifie que les noms concordent avec la logique du pattern // cad si le pattern dit que a+a se reecrit deux fois on verifie que les variables du pattern // aient meme nom char patternName = pattern.getName(); char arbreName = arbre.getName(); // si on a deja rencontre cette lettre de pattern alors la lettre de la var doit correspondre // dans la ht if (ht.containsKey(patternName)) { if (ht.get(patternName).getName() != arbreName) return false; } else ht.put(patternName, arbre); } // si ce sont des entiers ils doivent avoir meme valeur if (pattern.getType().contains("Entier")) { if (pattern.calculateValue() != arbre.calculateValue()) return false; } // si on a des expressions operators if (pattern.getType().contains("expressionoperator")) { // on verifie qu'ils aient meme nb d'enfants if (pattern.getChildren().size() != arbre.getChildren().size()) return false; for (i = 0; i < pattern.getChildren().size(); i++) { // si une des comparaisons rate tout rate check = compareExpressions(pattern.getChildren().get(i), arbre.getChildren().get(i), ht); if (check == false) return false; } } return true; }