86Fermer88
FarewellLe 08/10/2009 à 00:22
Bon, j'ai réussi à coucher un algo qui me semble complet (manque juste les labels, mais c'est rien, c'est résoudru par ailleurs.

Ce qui me fait suer, c'est que l'algo de PpHd me semble mieux en vitesse et en mémoire, mais j'aimerais bien essayer le mien (qui devrait rester rapide pour les expressions simples, ie dans 99% des cas).
IMM , Ptr_apres_EXPR MainEval( EXPR )
Si (EXPR n'a pas d'opetateur)
 
	Alors	Si (EXPR termine par une parenthese fermante)
			BR_COUNT--				// Erreur si <0
		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 premiere valeur numerique trouvee
								// arg2 est le reste de l'expression, et peut contenir 
								// lui-meme plusieurs opérations
								// OP est l'operateur qui les sépare
		Eval( arg1 OP arg2 ) 




IMM Eval( arg1 OP arg2 ) 
Si (arg2 commence par une parenthese)
 
	Alors	BR_COUNT++
		MainEval( arg2 ) -> arg2						// On stocke le resultat
		Si (Operateur_apres_parenthese)						// Du boulot apres la parenthese ?

			Alors Si( Priorite( OP ) < Priorite(Operateur_apres_parenthese)	// Si c'est prioritaire

				Alors	arg2 -> arg3 OP2 arg4				// On decompose
					OP( arg1, Eval( arg3 OP2 arg4 ))		// Et on appelle dans le bon ordre

				Sinon Eval( OP1( arg1, arg2 ) OP2  arg3)		// Sinon on resoud la premiere operande
											// avec le resultat de la parenthese
			Sinon OP( arg, arg2 )						// Si il n'y a rien apres la parenthese,
											// on a une simple operation a faire

 
Si (arg2 n'a pas d'opérateur) 
 
	Alors	OP( arg1, arg2 ) 
 
	Sinon	arg2 -> arg3 OP2 arg4 					// On decompose alors arg2 == arg3 OP2 arg4
		Si Priorite( OP1 ) > Priorite( OP2 ) 
 
			Alors	OP1( arg1 , arg3 ) -> arg1		// On resoud l'operateur prioritaire
				Eval( arg1 OP2 arg4 )			// Recursion terminale, vu qu'on a deja
									// le premier resultat
 
			Sinon	OP1( arg1 , Eval( arg3 OP2 arg4 ))	// La on a Priorite( OP1 ) < Priorite( OP2 )
									// Recursion profonde, vu qu'on a pas encore le
									// resultat de arg1 OP arg2
 
 
arg1 est une valeur numerique
arg2 est un pointeur la suite de l'expression 
OP est un tag


Ca me semble bon, même si c'est sûrement trop complexe. Mais je verrai ça demain, à tête reposée. En tout cas, je suis rassuré d'avoir la solution de PpHd au cas où, même si j'aime bien essayer de me démerder.

En tout cas, un grand merci à tous. smile