Evaluer une expression à partir d'une chaine de caractère

Description

Cette Source est surtout un exercice de style. Elle permet d'évaluer une expression par exemple :
2 + 4 ou encore 2*5 = 10. Elle supporte les opérateurs suivants :
+,-,*,/, %(->modulo),^(->Puissance), &(->Concaténation) AINSI QUE LES OPERATEURS DE COMPARAISON SUIVANTS
=, <>,<,>, ||, &&. Elle gère l'ordre des parenthèses({,(,),}) ainsi que l'ordre d'exécution des expressions.

J'ai mis deux versions de la classe. Une qui utilise la fonction EVAL, et l'autre uniquement du PHP. Si vous trouvez une moyen d'optimiser ces class. Merci de me le faire savoir, je les utilise pour un moteur de template dans un de mes projets personels.

Source / Exemple :


<?php
	/*------------------------------------------------------------
						EXERCICE DE STYLE
	------------------------------------------------------------*/
	function calcul_execution() {
		list($msec, $sec) = explode(' ', microtime());
		return ((float) $sec + (float) $msec) * 1000000;
	}
	
	
	include("Class_Evaluer.php"); //N'utilise pas la méthode Eval
	//include("Class_EvaluerB.php"); //Utilise la méthode Eval
	
	
	function Evaluer_Chaine($Chaine){
		$test=new Evaluation();
		$tab=$test->Evaluer($Chaine);
		echo "-->Evaluation de la Chaine : <b>".$Chaine."</b><br />\r\n";
	
		if(is_bool($tab)){
			if($tab){
				echo "---->Résultat : <b>VRAI</b> <br />\r\n&nbsp;<br />\r\n";
			}else{
				echo "---->Résultat : <b>FAUX</b> <br />\r\n&nbsp;<br />\r\n";
			}
		}else{
			echo "---->Résultat : <b>".$tab."</b> <br />\r\n&nbsp;<br />\r\n";
		}
	}

	$debut_calcul = calcul_execution();
	
	 Evaluer_Chaine(" 4^2^3 ");
	 Evaluer_Chaine(" 4^2^3 -42 ");
	 Evaluer_Chaine(" 'Salut' & ' tout le monde c\\'est chouette hein ?'");
	 Evaluer_Chaine(" 1+(3+2)*5 = 26");
	 Evaluer_Chaine(" 6*6 > 35 && 2>3");
	 Evaluer_Chaine(" 6*6 > 35 || 2>3");
	 Evaluer_Chaine(" (9%2) = 1");
	
	$fin_calcul = calcul_execution();	
	echo '<br />Temps execution: ',($fin_calcul-$debut_calcul)/1000000,' secondes.<br></span></center>'; 
?>

Conclusion :


J'attends vos remarques d'amélioration ainsi que tout autre remarques constructive.

Codes Sources

A voir également