Bonjour,

j'ai besoin de votre aide afin que je puisse faire mon projet qui consiste à programmer un évaluateur d'expression mathématiques en PASCAL.
Étant novice, j'ai cherché sur le net la méthodologie, j'ai compris qu'il y a deux phases : lexer et parser.

J'ai reussi à faire le lexer, mais le parser me pose problème. Je dois faire un arbre binaire à ce que j'ai compris (totalement nouveau pour moi), mais je ne sais pas comment procéder.

Je vous précise qu'à cette étape l'expression saisie est correcte (déjà analysée par le lexer) et donc le parser reçoit un tableau (une classe) contenant des lexèmes correspondant aux différents symboles mathématiques (+,-,*,/,cos,sin,(,),x, ...).
J'ai eu l'idée de faire comme ceci :
1- Recherche des parenthèses
2- Recherche de l'opération la moins prioritaire (tête de l'arbre)
3- Évaluation de l'expression

Mais je ne sais pas comment rattacher les parenthèses entre elles.
Je dois faire une fonction créant l'arbre binaire correspondant à l'expression , et une procédure qui génère le parcours de la lecture de l'arbre pour l'évaluer et le calculer pour différentes valeurs de x.
J'aurais besoin d'une explication ou d'un exemple car je suis bloqué.

Je vous poste le début de ce qu j'ai fait (recherche de parenthèses)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Function Arbre(Tableau_lexeme:Ctab_fonction):Cnoeud;
var
  i,debut,fin,j,p: integer; trouver:boolean ; Tableau_intermediaire:CTab_fonction ; Noeud_Intermediaire: CNoeud;
begin
trouver:=false; position:=false;
For i:=1 to Tableau_lexeme.longueur do
begin
  if tableau_lexeme.Tabfonction[i].symbole = '('
     then
         begin
         debut:=i; trouver:=true; i:=i+1 ; j:=1;        //debut : position parenthese ouvrante
 
         Repeat
         if tableau_lexeme.Tabfonction[i].symbole:='(' then j:=j+1;
         if tableau_lexeme.tabfonction[i].symbole:=')' then j:=j-1;
         i:=i+1
         until j=0 or i>tableau_lexeme.longueur;
         i:=i-1;   fin := i;
         p:=1
         For i:=debut+1 to fin-1 do
             begin
             Tableau_intermediaire.Tabfonction[p]:=Tableau_lexeme.Tabfonction[i];
             Tableau_intermediaire.longueur:= fin-debut-1;
             p:=p+1;
             end;
 
         CNoeud.Create;
         Noeud_Intermediaire:=Arbre(Tableau_Intermediaire);
 
         end;
end;


merci d'avance.