74Fermer76
FarewellLe 07/10/2009 à 20:19
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