From 65066596e8ec041cf2a558f737d3f055525e03b9 Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Sat, 20 Apr 2024 09:40:04 +0200 Subject: [PATCH] improved bracket handling in function string generation. --- src/classes/PFunction.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/classes/PFunction.cpp b/src/classes/PFunction.cpp index ef8bd0d2..712988a4 100644 --- a/src/classes/PFunction.cpp +++ b/src/classes/PFunction.cpp @@ -597,6 +597,7 @@ void PFunction::EvalTreeForString(tree_parse_info<> info) void PFunction::EvalTreeForStringExpression(iter_t const& i) { static Int_t termOp = 0; + static bool funcFlag = false; if (i->value.id() == PFunctionGrammar::realID) { assert(i->children.size() == 0); @@ -627,7 +628,8 @@ void PFunction::EvalTreeForStringExpression(iter_t const& i) assert(i->children.size() == 0); fFuncString += boost::algorithm::trim_copy(std::string(i->value.begin(), i->value.end())).c_str(); } else if (i->value.id() == PFunctionGrammar::functionID) { - assert(i->children.size() == 3); + assert(i->children.size() == 3); + funcFlag = true; fFuncString += std::string(i->value.begin(), i->value.end()).c_str(); // keep function name fFuncString += "("; // '(', expression, ')' @@ -635,6 +637,7 @@ void PFunction::EvalTreeForStringExpression(iter_t const& i) fFuncString += ")"; } else if (i->value.id() == PFunctionGrammar::powerID) { assert(i->children.size() == 5); + funcFlag = true; fFuncString += std::string(i->value.begin(), i->value.end()).c_str(); // keep function name fFuncString += "("; // '(', expression, ',' expression, ')' @@ -655,15 +658,21 @@ void PFunction::EvalTreeForStringExpression(iter_t const& i) assert(i->children.size() == 2); EvalTreeForStringExpression(i->children.begin()); fFuncString += " / "; - fFuncString += "("; + if (((i->children.begin()+1)->children.size()>1) && + ((i->children.begin()+1)->value.id() != PFunctionGrammar::functionID) && + (i->children.begin()+1)->value.id() != PFunctionGrammar::powerID) // check if denominator is non-trivial and not a function + fFuncString += "("; EvalTreeForStringExpression(i->children.begin()+1); - fFuncString += ")"; + if (((i->children.begin()+1)->children.size()>1) && + ((i->children.begin()+1)->value.id() != PFunctionGrammar::functionID) && + (i->children.begin()+1)->value.id() != PFunctionGrammar::powerID) // check if denominator is non-trivial and not a function + fFuncString += ")"; } else { assert(0); } termOp--; } else if (i->value.id() == PFunctionGrammar::expressionID) { - if (termOp > 0) + if ((termOp > 0) && !funcFlag) fFuncString += "("; if (*i->value.begin() == '+') { assert(i->children.size() == 2); @@ -678,8 +687,9 @@ void PFunction::EvalTreeForStringExpression(iter_t const& i) } else { assert(0); } - if (termOp > 0) + if ((termOp > 0) && !funcFlag) fFuncString += ")"; + funcFlag = false; } else if (i->value.id() == PFunctionGrammar::assignmentID) { assert(i->children.size() == 3); EvalTreeForStringExpression(i->children.begin());