j'ai essayé d'améliorer, en descendant plus dans les détails de l'implémentation, et surtout en ajoutant les parenthèes (du moins, la parenthèse ouvrante, je pense qu'il faut un compteur pour la parenthèse fermante).
Chiffres :
$~0123456789abcdefABCDEF
Opérateurs unaires, à résoudre immédiatement :
~ -
Opérateurs, par ordre de priorité :
[+ -] [* /] [<< >>] [& |]
Opérateur mettant un flag global :
#
IMM MainEval( EXPR )
Si (EXPR n'a pas d'opétateur)
Alors EXPR -> IMM // Il ne s'agit que d'un chiffre ou d'un symbole à lire
Sinon EXPR -> arg1 OP arg2 // On décompose EXPR
// arg1 est la première valeur numérique trouvée
// arg2 est le reste de l'expression, et peut contenir
// lui-même plusieurs opérations
// OP est l'opérateur qui les sépare
Eval( arg1 OP arg2 )
IMM Eval( arg1 OP arg2 )
Si (arg2 commence par une parenthèse)
Alors Eval( arg1 OP MainEval( arg2 )) // récursion terminale
Si (arg2 n'a pas d'opérateur)
Alors OP( arg1, arg2 )
Sinon arg2 -> arg3 OP2 arg4 // On décompose alors arg2 == arg3 OP2 arg4
Si Priorite( OP1 ) > Priorite( OP2 )
Alors OP1( arg1 , arg3 ) -> arg1 // On résoud l'opérateur prioritaire
Eval( arg1 OP2 arg4 ) // Récursion terminale, vu qu'on a déjà
// le premier résultat
Sinon OP1( arg1 , Eval( arg3 OP2 arg4 )) // Là on a Priorite( OP1 ) < Priorite( OP2 )
// Récursion profonde, vu qu'on a pas encore le
// résultat de arg1 OP arg2
arg1 est une valeur numérique
arg2 est un pointeur la suite de l'expression
OP est un tag