TiMad
a écrit :
question conne mais c'est chaud non de parser une expression algebrique en notion polonaise non?
non, c'est hyper simple, c'est ce qu'on a fait pour notre bistro...
pour l'implementer, il te faut une pile d'operateurs, et la chaine finale de ton expression.
tous les nombres que tu rencontres tu les baances les uns a la suite des autres dans la chaine finale. des que tu trouves un operateur tu te prepare a le mettre dans la pile. si le dernier operateur de la pile a une priorite plus haute que celui que tu veux mettre dedans, tu depile tous les operateurs et tu les balance dans la chaine finale jusqu'a ce que tu tombes sur un operateur de priorite <= a celui que tu veux mettre... quand tu as une parenthese ouvrante, elle "masque" tous les operateurs en dessous d'elle, c'est comme si tu recommencais avec une pile d'operateurs vide. en gros elle a une priorite 0, et aucun test n'est fait quand tu l'empile. quand tu tombe sur une parenthese fermante, tu desempile tout jusqu'a ce que tu tombes sur une parenthese ouvrante (ou le debut de la pile, dans ce cas y a un msg d'erreur style "parse error: missing '(' "). quand t'arrives a la fin de la chaine de depart, tu desempiles tous les operateurs restants (et si tu tombes sur une parenthese ouvrante, tu marque: "parse error: missing ')' ")
bon ca a peut etre pas l'air super simple comme ca mais:
exemple:
(a+b+e+f)*(r+t+y-z/(c+d)^2)
pile | |
| |
| |
| |
| |
| |
| |
| |
| |
'-'
[4]([/4]a+b+e+f)*(r+t+y-z/(c+d)^2)
\
|
V
pile | |
| |
| |
| |
| |
| |
| |
| |
|(|
'-'
([4]a[/4]+b+e+f)*(r+t+y-z/(c+d)^2) ------> a
pile | |
| |
| |
| |
| |
| |
| |
| |
|(|
'-'
(a[4]+[/4]b+e+f)*(r+t+y-z/(c+d)^2) a
\
|
V
pile | |
| |
| |
| |
| |
| |
| |
|+|
|(|
'-'
(a+[4]b[/4]+e+f)*(r+t+y-z/(c+d)^2) ------> a b
pile | |
| |
| |
| |
| |
| |
| |
|+|
|(|
'-'
(a+b[4]+[/4]e+f)*(r+t+y-z/(c+d)^2) a b
\
|
V
pile | |
| |
| |
| |
| |
| |
|+|
|+|
|(|
'-'
(a+b+[4]e[/4]+f)*(r+t+y-z/(c+d)^2) ------> a b e
pile | |
| |
| |
| |
| |
| |
|+|
|+|
|(|
'-'
(a+b+e[4]+[/4]f)*(r+t+y-z/(c+d)^2) a b e
\
|
V
pile | |
| |
| |
| |
| |
|+|
|+|
|+|
|(|
'-'
(a+b+e+[4]f[/4])*(r+t+y-z/(c+d)^2) -------> a b e f
pile | |
| |
| |
| |
| |
|+|
|+|
|+|
|(|
'-'
(a+b+e+f[4])[/4]*(r+t+y-z/(c+d)^2) a b e f +
.----->
/
|
pile | |
| |
| |
| |
| |
| |
|+|
|+|
|(|
'-'
(a+b+e+f[4])[/4]*(r+t+y-z/(c+d)^2) a b e f + +
.----->
/
|
pile | |
| |
| |
| |
| |
| |
| |
|+|
|(|
'-'
(a+b+e+f[4])[/4]*(r+t+y-z/(c+d)^2) a b e f + + +
.----->
/
|
pile | |
| |
| |
| |
| |
| |
| |
| |
| |
'-'
(a+b+e+f)[4]*[/4](r+t+y-z/(c+d)^2) a b e f + + +
\
|
V
pile | |
| |
| |
| |
| |
| |
| |
| |
|*|
'-'
(a+b+e+f)*[4]([/4]r+t+y-z/(c+d)^2) a b e f + + +
\
|
V
pile | |
| |
| |
| |
| |
| |
| |
|(|
|*|
'-'
(a+b+e+f)*([4]r[/4]+t+y-z/(c+d)^2) ------> a b e f + + + r
pile | |
| |
| |
| |
| |
| |
| |
|(|
|*|
'-'
(a+b+e+f)*(r[4]+[/4]t+y-z/(c+d)^2) a b e f + + + r
\
|
V
pile | |
| |
| |
| |
| |
| |
|+|
|(|
|*|
'-'
(a+b+e+f)*(r+[4]t[/4]+y-z/(c+d)^2) ------> a b e f + + + r t
pile | |
| |
| |
| |
| |
| |
|+|
|(|
|*|
'-'