/** * Avalia a expressão e retorna o seu valor (resolve a expessão) * @param TreeNode|TreeLeaf $treeNode Arvore que será analizada * @return float|int|null Resultado da expressão */ public function evaluate($treeNode = null) { $result = null; if ($treeNode == null) { $result = $this->treeNode == null ? 0 : $this->evaluate($this->treeNode); } else { if ($treeNode instanceof TreeLeaf) { /** * SE é uma folha, então so tem o valor numérico */ $result = $treeNode->getValue(); } else { /** * Aqui é nó binário, então existe o lado esquerdo, direito e o operador */ $operator = $treeNode->getOperator(); /** * Chama recursivamente cada lado do nó (que podem ser outros nós) */ $valueLeft = $this->evaluate($treeNode->getLeft()); $valueRight = $this->evaluate($treeNode->getRight()); /** * Executa as operações */ switch ($operator) { case '+': $result = $valueLeft + $valueRight; break; case '-': $result = $valueLeft - $valueRight; break; case '*': $result = $valueLeft * $valueRight; break; case '/': $result = $valueLeft / $valueRight; break; case '^': $result = $valueLeft ^ $valueRight; break; } } } return $result; }