From 224a3ea97ba98df293145afa0b578d60e895a798 Mon Sep 17 00:00:00 2001 From: Benjamin Renard <benjamin.renard@akka.eu> Date: Fri, 24 Nov 2017 10:02:03 +0100 Subject: [PATCH] Fix expression parser when a function have more than one argument --- src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php index 0a4713e..1000315 100644 --- a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php +++ b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php @@ -21,6 +21,7 @@ class IHMExpressionParserClass private static $functionsNode = 'function'; private static $functionsNameAtt = 'name'; private static $functionsArgsAtt = 'args'; + private static $functionsParamsAtt = 'params'; private static $functionsNewKernelNode = 'new_kernel'; //operator @@ -82,6 +83,7 @@ class IHMExpressionParserClass "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"))), + "cross(vect_1,vect_2)" => array("expression" => "(cross(\$vect_1,\$vect_2))", "params" => array(array("paramid" => "vect_1"), array("paramid" => "vect_2"))), ); //init constants, aliases and functions for test @@ -96,13 +98,14 @@ class IHMExpressionParserClass ); $this->functionsArray = array( - "func_old" => array("kernel_name" => "func_new", "nb_args" => 0), - "atan" => array("kernel_name" => "atan", "nb_args" => 0), - "shiftT_" => array("kernel_name" => "#timeShift", "nb_args" => 1), - "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), + "func_old" => array("kernel_name" => "func_new", "nb_args" => 0, "nb_params" => 1), + "atan" => array("kernel_name" => "atan", "nb_args" => 0, "nb_params" => 1), + "shiftT_" => array("kernel_name" => "#timeShift", "nb_args" => 1, "nb_params" => 1), + "smooth_" => array("kernel_name" => "#boxcar", "nb_args" => 1, "nb_params" => 1), + "deriv" => array("kernel_name" => "#deriv", "nb_args" => 0, "nb_params" => 1), + "abs" => array("kernel_name" => "abs", "nb_args" => 0, "nb_params" => 1), + "sqrt" => array("kernel_name" => "sqrt", "nb_args" => 0, "nb_params" => 1), + "cross" => array("kernel_name" => "cross", "nb_args" => 0, "nb_params" => 2), ); //add operator to change in function @@ -304,6 +307,7 @@ class IHMExpressionParserClass { $tempArr = explode('(', $functions_->item($i)->getAttribute(self::$functionsNameAtt)); $nbArgs = $functions_->item($i)->getAttribute(self::$functionsArgsAtt); + $nbParams = $functions_->item($i)->getAttribute(self::$functionsParamsAtt); $kernelFunctions_ = $functions_->item($i)->getElementsByTagName(self::$functionsNewKernelNode); if ($kernelFunctions_->length == 0) $kernelFunction = ""; @@ -312,6 +316,7 @@ class IHMExpressionParserClass $this->functionsArray[$tempArr[0]] = array( "kernel_name" => $kernelFunction, "nb_args" => intval($nbArgs), + "nb_params" => intval($nbParams), "isOperator" => false ); } @@ -790,7 +795,7 @@ class IHMExpressionParserClass /* * @brief process used to replace "," by ";" for function */ - private function fixComaFunction($tree,$isFunctionGroup,&$result) + private function fixComaFunction($tree,$crt_function,&$result,&$nbParams) { for ($i = 0; $i < count($tree); ++$i) { @@ -802,15 +807,20 @@ class IHMExpressionParserClass $groupFunc = $this->isFunction($tree[$i-1]); } $res = array(); - $this->fixComaFunction($tree[$i],$groupFunc,$res); + $nbParams = 0; + $this->fixComaFunction($tree[$i],$groupFunc ? $tree[$i-1] : "",$res,$nbParams); $result[] = $res; } else { - if ($isFunctionGroup && ($tree[$i] == ',')) - $result[] = ';'; - else + if (!empty($crt_function) && ($tree[$i] == ',')) { + $nb_func_params = $this->functionsArray[$crt_function]["nb_params"]; + $result[] = ($nb_func_params <= $nbParams) ? ';' : ','; + } + else { + ++$nbParams; $result[] = $tree[$i]; + } } } } @@ -920,7 +930,8 @@ class IHMExpressionParserClass $this->fixGroupFunction($res_1,$res_2); $res_3 = array(); - $this->fixComaFunction($res_2,false,$res_3); + $nbParams = 0; + $this->fixComaFunction($res_2,"",$res_3,$nbParams); $res_4 = array(); $this->fixOperatorToFunction($res_3,$res_4); -- libgit2 0.21.2