J'ai fait ce programme il y a un moment, je te donne le code source de l'analyseur, sachant que j'avais utilisé le design pattern composite pour les branches de l'arbre, je pense que c'est ce que tu as fais aussi, si ce n'est pas le cas, tu vas avoir du mal à t'en sortir.
Je te laisse adapter ce code à ton programme
package metier.analyseur;
import java.util.ArrayList;
import java.util.List;
import metier.arbre.ArbreFactory;
import metier.arbre.IArbre;
import metier.composant.IComposant;
import metier.composant.noeud.NoeudFactory;
import metier.composant.operande.Constantes;
import metier.composant.operande.OperandeFactory;
import metier.composant.operateur.IOperateur;
import metier.composant.operateur.OperateurFactory;
import metier.composant.operateur.TypeOperateur;
import metier.composant.operateur.fonction.FonctionFactory;
import metier.composant.operateur.fonction.IFonction;
import metier.composant.operateur.fonction.TypeFonction;
import exception.EquationIncorrecteException;
import exception.ValeurIncorrecteException;
/**
* Classe définissant les fonctions d'analyse d'une chaine de caractères
*
* @author Julien
*
*/
public class Analyse {
/**
* Effectue la calcul
* @param s
* @return
*/
public double calculer(String s){
return creerArbre(s).calculer();
}
/**
* Créé l'arbre correspondant à l'équation
* @param equation : equation a calculer
* @return l'abre
*/
private IArbre creerArbre(String equation){
IComposant racine=null;
try {
racine = creerNoeudRacineSimple(equation);
}
catch (EquationIncorrecteException e) {
e.printStackTrace();
}
return ArbreFactory.getInstance().getArbre(racine);
}
private IComposant creerNoeudRacineSimple(String equation) throws EquationIncorrecteException{
IComposant res=null;
if(isNumber(equation)){
res = OperandeFactory.getInstance().getOperande(equation);
}
else {
List indices = rechercherIndiceOperateur(equation, 0, true);
List listeOperateurs = rechercherOperateur(equation, indices);
if(indices.size()==0){
indices = rechercherIndiceOperateur(equation, 0, false);
listeOperateurs = rechercherOperateur(equation, indices);
}
if(indices.size()==0){
if(getFonction(equation)==null){
res=creerNoeudRacineSimple(equation.substring(1, equation.length()-1));
}
else{
IFonction fonction = getFonction(equation);
res=NoeudFactory.getInstance().getNoeud(
fonction,
creerNoeudRacineSimple(
equation.substring(fonction.getNbLettres()+1, equation.length()-1))
);
}
}
else{
int k=0;
for(int i=0; i<listeOperateurs.size(); i++){
if(listeOperateurs.get(i).getType()==TypeOperateur.Multiplication || listeOperateurs.get(i).getType()==TypeOperateur.Division){
k=i;
}
}
res=NoeudFactory.getInstance().getNoeud(
listeOperateurs.get(k),
creerNoeudRacineSimple(equation.substring(0, indices.get(k))),
creerNoeudRacineSimple(equation.substring(indices.get(k)+1, equation.length()))
);
}
}
return res;
}
/**
* Fonction retournant vrai si le paramètre est un nombre
* @param s
* @return
*/
private boolean isNumber(String s){
boolean res=true;
for(int i=0; i<s.length(); i++){
if(!"1234567890.".contains(s.charAt(i)+"")){
res=false;
}
}
for(Constantes c : Constantes.values()){
if(s.equals(c.name())){
res=true;
}
}
return res;
}
/**
* Fonction permettant de récupérer une fonction dans une chaine
* @param s
* @return
*/
private IFonction getFonction(String s){
IFonction f = null;
for(TypeFonction t : TypeFonction.values()){
if(t.getSymbole().length()<s.length() && s.substring(0, t.getSymbole().length()).equals(t.getSymbole())){
f=FonctionFactory.getInstance().getFonction(t);
}
}
return f;
}
/**
* Fonction qui donne le nombre de parentheses ouvertes et non refermées
* @param indice
* @param eq
* @return
*/
private int getNiveau(int indice, String eq){
int niveau=0;
for(int i=0; i rechercherIndiceOperateur(String equation, int niveau, boolean justeNP){
List liste = new ArrayList();
for(int i=0; i<equation.length(); i++){
for(TypeOperateur t : TypeOperateur.values()){
if(equation.charAt(i)==t.getSymbole() && getNiveau(i, equation)==niveau){
if(!justeNP || !t.isPrioritaire()){
liste.add(i);
}
}
}
}
return liste;
}
/**
* Fonction qui recherche les opérateurs dans une chaine
* @param equation
* @param indices
* @return
*/
private List rechercherOperateur(String equation, List indices){
List liste = new ArrayList();
for(Integer i : indices){
try {
liste.add(OperateurFactory.getInstance().getOperateur(TypeOperateur.getTypeOperateurBySymbole(equation.charAt(i))));
}
catch (ValeurIncorrecteException e) {
e.printStackTrace();
}
}
return liste;
}
}