From 9dbbc3b0bc9e8a1340c52fcda399bbf4e2be2c84 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Wed, 16 Aug 2017 16:43:40 +0200 Subject: [PATCH] Fix expression parsing when some brackets are added for operators priority --- src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php index 3e9ac0b..7c74b11 100644 --- a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php +++ b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php @@ -66,20 +66,22 @@ class IHMExpressionParserClass { //tests $tests = array( - "dst>3" => array ("expression" => "(greater_than(\$dst,3))", "params" => array(array("paramid" => "dst"))), - "@const_1 array("expression" => "(lower_than(1.0E-10,\$dst))", "params" => array(array("paramid" =>"dst"))), - "dst^#alias_2" => array("expression" => "(pow(\$dst,\$imf[1]))", "params" => array(array("paramid" => "dst"),array("paramid" => "imf"))), - "dst^2+@const_2" => array("expression" => "(pow(\$dst,2))+-2.8", "params" => array(array("paramid" => "dst"))), - "atan(imf(2)/imf(1))+speed/100.0" => array("expression" => "(atan((\$imf[2]/\$imf[1])))+(\$speed/100.0)", "params" => array(array("paramid" => "imf"), array("paramid" => "speed"))), + "dst>3" => array ("expression" => "greater_than(\$dst,3)", "params" => array(array("paramid" => "dst"))), + "@const_1 array("expression" => "lower_than(1.0E-10,\$dst)", "params" => array(array("paramid" =>"dst"))), + "dst^#alias_2" => array("expression" => "pow(\$dst,\$imf[1])", "params" => array(array("paramid" => "dst"),array("paramid" => "imf"))), + "dst^2+@const_2" => array("expression" => "pow(\$dst,2)+-2.8", "params" => array(array("paramid" => "dst"))), + "atan(imf(2)/imf(1))+speed/100.0" => array("expression" => "(atan(\$imf[2]/\$imf[1]))+\$speed/100.0", "params" => array(array("paramid" => "imf"), array("paramid" => "speed"))), "shiftT_(clust1_hia_pad,60)" => array("expression" => "(#timeShift(\$clust1_hia_pad;60))", "params" => array(array("paramid" => "clust1_hia_pad"))), "smooth_(density,1200)" => array("expression" => "(#boxcar(\$density;1200))", "params" => array(array("paramid" => "density"))), "shiftT_(density,-600)" => array("expression" => "(#timeShift(\$density;-600))", "params" => array(array("paramid" => "density"))), "deriv(density)" => array("expression" => "(#deriv(\$density))", "params" => array(array("paramid" => "density"))), "abs(dst)" =>array("expression" => "(abs(\$dst))", "params" => array(array("paramid" => "dst"))), - "density*speed+(density^2-1.0)/speed" => array("expression" => "(\$density*\$speed)+((pow(\$density,2))-1.0)/\$speed", "params" => array(array("paramid" => "density"),array("paramid" => "speed"))), + "density*speed+(density^2-1.0)/speed" => array("expression" => "\$density*\$speed+(pow(\$density,2)-1.0)/\$speed", "params" => array(array("paramid" => "density"),array("paramid" => "speed"))), "(-7 array("expression" => "And((lower_than(-7,\$dst)),(lower_than(\$dst,-3)))", "params" => array(array("paramid" => "dst"))), "cass_caps_elssec4(range[0,10])" => array("expression" => "\$sum_into_table_range_cass_caps_elssec4_0_0_10", "params" => array(array("paramid" => "sum_into_table_range", "fullparamid" => "sum_into_table_range_cass_caps_elssec4_0_0_10", "template_args" => array("paramid"=>"cass_caps_elssec4","relateddim"=>0,"min"=>"0","max"=>"10")))), "abs(dst)>0" => array("expression" => "greater_than((abs(\$dst)),0)", "params" => array(array("paramid" => "dst"))), + "2/(1+dst)" => array("expression" => "2/(1+\$dst)", "params" => array(array("paramid" => "dst"))), + "2/abs(1+dst)" => array("expression" => "2/(abs(1+\$dst))", "params" => array(array("paramid" => "dst"))), ); //init constants, aliases and functions for test @@ -100,6 +102,7 @@ class IHMExpressionParserClass "smooth_" => array("kernel_name" => "#boxcar", "nb_args" => 1), "deriv" => array("kernel_name" => "#deriv", "nb_args" => 0), "abs" => array("kernel_name" => "abs", "nb_args" => 0), + "sqrt" => array("kernel_name" => "sqrt", "nb_args" => 0), ); //add operator to change in function @@ -449,7 +452,7 @@ class IHMExpressionParserClass $els[] = $elements[$j]; $elements = $els; - + //regroup negative number $els = array(); $i = 0; @@ -474,14 +477,14 @@ class IHMExpressionParserClass $elements = $els; //add brackets for operators priority - + $els = array(); $i = 0; for ($i; $i < count($elements)-2; ++$i) { if ($elements[$i+1] == "*" || $elements[$i+1] == "/" || $elements[$i+1] == "^" || $elements[$i+1] == "<" || $elements[$i+1] == ">") { - if ($elements[$i] != ")") + if ($elements[$i] != ")" && ($this->isDecimal($elements[$i+1]) || $this->isInteger($elements[$i+1]))) { $els[] = "("; $els[] = $elements[$i]; @@ -501,7 +504,7 @@ class IHMExpressionParserClass //split parameters and components $elements = $els; - + $els = array(); $i = 0; for ($i; $i < count($elements); ++$i) @@ -762,7 +765,6 @@ class IHMExpressionParserClass private function fixGroupFunction($tree,&$result) { $result = array(); - for ($i = 0; $i < count($tree); ++$i) { if (is_array($tree[$i])) { -- libgit2 0.21.2